http://www.perlmonks.org?node_id=541133


in reply to my $x or my ($x)

AFAIK the list context just allows you to declare a whole bunch of vars in one go - e.g.

my $foo; my $bar;

and

my ($foo, $bar);

are the same.

Tom Melly, tom@tomandlu.co.uk

Replies are listed 'Best First'.
Re^2: my $x or my ($x)
by jhourcle (Prior) on Apr 04, 2006 at 12:15 UTC

    Although it's convenient that you can declare a whole lot of variables in one line, the big advantage is that you can handle assignments at the same time:

    my ($foo, $bar) = @array;

    The only warning I can give is that using an undef in the list will throw warnings (errors?) in older versions of perl:

    my (undef, $foo, undef, $bar) = @array;

    You can assign values from a list of scalars, as well, but I think it's less legible than assigning one at a time:

     my ($foo, $bar, $baz) = (27, 'blah', $x);

      One common mistake that is made when assigning to a collection of scalars is this:

      my ($one, $two, $three, $four) = 0;

      People tend to think that all four variables are initialized, but really only $one is set to zero, the rest are still undef. You'd have to explicitly set each variable to achieve that result:

      my $one = my $two = my $three = my $four = 0;

      ... or alternatively:

      my ($one, $two, $three, $four) = (0,0,0,0);

      But as was stated elsewhere, this lacks readability for large collections of scalars. In general, I tend to declare my variables and either initialize them to zero or leave them undefined, then assigning their values in later statements. I hate getting warnings about variables being undef when evaluating in a conditional statement.


      No good deed goes unpunished. -- (attributed to) Oscar Wilde
        Just a quick addition to ptum's. I would write:
        my ($one, $two, $three, $four) = (0,0,0,0);
        as
        my ($one, $two, $three, $four) = (0) x 4;
      The only warning I can give is that using an undef in the list will throw warnings (errors?) in older versions of perl:
      my (undef, $foo, undef, $bar) = @array;


      Never fear. Just move your my.
      (undef, my $foo, undef, my $bar) = @array;

      This is particularly more useful in cases where you already have a declared variable.
      my $foo = "ab"; (my $avar, $foo) = ($foo =~ /(.)(.)/);


      my @a=qw(random brilliant braindead); print $a[rand(@a)];

        I prefer slicing. Instead of:

        my (undef, $foo, undef, $bar) = @array;

        or

        (undef, my $foo, undef, my $bar) = @array;

        do:

        my ($foo, $bar) = @array[1,3];

        e.g.

        my ($size, $mtime) = (stat $filename)[7,9];