Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re: -> Is Optional ?

by roboticus (Chancellor)
on Dec 28, 2012 at 16:00 UTC ( #1010716=note: print w/ replies, xml ) Need Help??


in reply to -> Is Optional ?

ree:

Just a bit of clarification on RichardK's answer: Notice how it says 'between' subscripts. So after the first one, it's always optional. Before the first one, though, you need to tell perl that you're accessing a value through a reference, and there are two ways you can do so. Either add a '$' to the front, or use a '->' after the scalar:

my @a = ( 1, 4, 9, 16); # squares my @b = ( 1, 8, 27, 64); # cubes my @c = ( \@a, \@b ); # two arrays my $d = \@a; my $e = \@c; # OK: @a is an array print $a[0]; # Wrong: $d is a reference, not an array! print $d[0]; # OK: Both of these are fine, though print $d->[0]; print $$d[0]; # with multiple subscripts: print $e->[0]->[0]; print $e->[0][0]; # same as above, since -> is optional between sub +scripts print $$e[0][0]; # also same as above

You may find yourself preferring an extra '$' at the front (which is what I usually use) or using the '->' (which I use when I want to alert myself to the fact that I'm using a reference). You need to be comfortable with both, since you'll frequently encounter both notations.

Update: D'oh! I bungled my variable declarations, as caught by roho and explained by Athanasius. Corrected (converted square brackets to parenthesis in first three lines).

...roboticus

When your only tool is a hammer, all problems look like your thumb.


Comment on Re: -> Is Optional ?
Download Code
Replies are listed 'Best First'.
Re^2: -> Is Optional ?
by roho (Abbot) on Dec 29, 2012 at 16:15 UTC
    Thanks for your sample code roboticus. I copied and ran it and discovered that an extra level of dereferencing is required. This was a good exercise in reference accessing. Below is your code with the modifications for the extra level of dereferencing. (Note: I commented out the line labeled "Wrong" so it would compile and run) Thanks again!

    my @a = [ 1, 4, 9, 16]; # squares my @b = [ 1, 8, 27, 64]; # cubes my @c = [ \@a, \@b ]; # two arrays my $d = \@a; my $e = \@c; # OK: @a is an array print "Sample1: ", $a[0]->[0], "\n"; # Wrong: "Sample1: ", $d is a reference, not an array! #print "Sample2: ", $d[0], "\n"; # OK: Both of these are fine, though print "Sample3: ", $d->[0]->[0], "\n"; print "Sample4: ", $$d[0]->[0], "\n"; # with multiple subscripts: print "Sample5: ", $e->[0]->[0]->[0]->[0], "\n"; print "Sample6: ", $e->[0][0][0][0], "\n"; # same as above, sin +ce -> is optional between subscripts print "Sample7: ", $$e[0][0][0][0], "\n"; # also same as above

    "Its not how hard you work, its how much you get done."

      The line

      my @a = [ 1, 4, 9, 16 ]; # squares

      creates an anonymous array with 4 elements, and assigns a reference to this anonymous array — i.e., a single, scalar value — to be the first (and only) element of the named array @a.

      I suspect that parentheses were intended rather than square brackets:

      my @a = ( 1, 4, 9, 16 ); # squares my @b = ( 1, 8, 27, 64 ); # cubes my @c = ( \@a, \@b ); # two arrays

      and then the rest of the original code behaves as intended.

      Hope that helps,

      Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (11)
As of 2015-07-29 12:34 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 (263 votes), past polls