Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

Re^2: my $x or my ($x)

by jhourcle (Prior)
on Apr 04, 2006 at 12:15 UTC ( #541137=note: print w/ replies, xml ) Need Help??

in reply to Re: my $x or my ($x)
in thread my $x or my ($x)

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);

Comment on Re^2: my $x or my ($x)
Select or Download Code
Replies are listed 'Best First'.
Re^3: my $x or my ($x)
by ptum (Priest) on Apr 04, 2006 at 13:39 UTC

    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);
      my ($one, $two, $three, $four) = (0) x 4;
Re^3: my $x or my ($x)
by Rhandom (Curate) on Apr 05, 2006 at 15:06 UTC
    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;


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


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


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

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://541137]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (5)
As of 2015-11-26 01:19 GMT
Find Nodes?
    Voting Booth?

    What would be the most significant thing to happen if a rope (or wire) tied the Earth and the Moon together?

    Results (695 votes), past polls