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

-> Is Optional ?

by vinoth.ree (Parson)
on Dec 28, 2012 at 11:43 UTC ( #1010691=perlquestion: print w/ replies, xml ) Need Help??
vinoth.ree has asked for the wisdom of the Perl Monks concerning the following question:

my $Rec_Ref = [1,2,3,4, 'name'=>'panic','age'=>'34','data'=>'10.98',}] +; print $Rec_Ref->[4]{'name'}."\n"

The above code gives me the value of 'name' key without using "->". Is that -> is optional ?

Comment on -> Is Optional ?
Download Code
Re: -> Is Optional ?
by zentara (Archbishop) on Dec 28, 2012 at 11:51 UTC
    See Fat Comma. You can use a comma instead.

    Oops, sorry ... I was informed by higher minds than me, that I misread the question and confused -> with =>. Mea Culpa Mea Culpa Mea Maxima Culpa. TGIF :-)


    I'm not really a human, but I play one on earth.
    Old Perl Programmer Haiku ................... flash japh
Re: -> Is Optional ?
by RichardK (Priest) on Dec 28, 2012 at 11:56 UTC

    Yes. See the docs in perlreftut which says :-

    Arrow Rule In between two subscripts, the arrow is optional.
Re: -> Is Optional ?
by Anonymous Monk on Dec 28, 2012 at 13:52 UTC
    Perl is very forgiving. "There's more than one way to SAY it, too." But you probably should use use strict; use warnings; for this reason if none other: sometimes the interpretation taken isn't quite what you expected.
Re: -> Is Optional ?
by space_monk (Chaplain) on Dec 28, 2012 at 15:55 UTC
    use strict; use warnings;
    As the previous poster said, if you haven't got these in your code, you are incredibly talented or incredibly stupid. As the original code is missing a brace in the variable declaration, I think we can guess which ..... :-)
    A Monk aims to give answers to those who have none, and to learn from those who know more.

      Your advice is a little off-point; while the posted code does contain a syntax error, this is a compilation error. Neither the addition of strict nor warnings would give any additional insight into the nature of the issue. Once you fix the curly issue, the code passes both tests just fine. I love these pragma dearly, but will never cite them in a response unless they actually help in the particular situation. Expecting people to include them above every code snippet, or expecting every code snippet to be a full script, is unnecessary orthodoxy.

      You may also wish to peruse ree's profile to gather information about his familiarity with the language.


      #11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

        Yes, I do apologise; I was aiming for amusement value more than anything else in my comment, but on reading it, it was probably a bit too aggressive.
        A Monk aims to give answers to those who have none, and to learn from those who know more.
Re: -> Is Optional ?
by roboticus (Canon) on Dec 28, 2012 at 16:00 UTC

    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.

      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,

Re: -> Is Optional ?
by Anonymous Monk on Dec 28, 2012 at 22:26 UTC

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1010691]
Approved by McDarren
Front-paged by Corion
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: (16)
As of 2014-07-28 15:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (201 votes), past polls