Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: my $x or my ($x)

by Melly (Hermit)
on Apr 04, 2006 at 12:07 UTC ( #541133=note: print w/ replies, xml ) Need Help??


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


Comment on Re: my $x or my ($x)
Select or Download Code
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];

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (12)
As of 2015-07-31 19:55 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 (280 votes), past polls