Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

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

      or

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

      do:

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

      e.g.

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

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (7)
As of 2014-12-27 08:26 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (176 votes), past polls