Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
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
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);
      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 exploiting the Monastery: (16)
As of 2015-07-07 19:25 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (93 votes), past polls