Beefy Boxes and Bandwidth Generously Provided by pair Networks RobOMonk
P is for Practical
 
PerlMonks  

Re: -> Is Optional ?

by roboticus (Canon)
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
Re^2: -> Is Optional ?
by roho (Monsignor) 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 drinking their drinks and smoking their pipes about the Monastery: (9)
As of 2014-04-20 00:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (485 votes), past polls