Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Re^4: Line numbers

by chromatic (Archbishop)
on Mar 17, 2012 at 00:02 UTC ( #960095=note: print w/replies, xml ) Need Help??

in reply to Re^3: Line numbers
in thread Line numbers

It is non-obvious why (caller(0))[2] should work but caller(0)[2] should fail.


Replies are listed 'Best First'.
Re^5: Line numbers
by tobyink (Canon) on Mar 17, 2012 at 00:12 UTC

    That there exists an explanation does not imply that the explanation is obvious.

    I understand that light may act as a wave or particle depending on how you study it. However, this fact is not obvious. It is in fact incredibly non-obvious, which is how it took science so long to get there.

    That [caller(0)]->[0] works is (at least to me) obvious. That (caller(0))[0] works and caller(0)[0] fails is (again, to me) non-obvious.

    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
      I understand that light may act as a wave or particle depending on how you study it.

      Certainly, but unlike particle physics, Perl comes with a manual.

      I'm not claiming that slicing the list returned from a function has syntax that's immediately obvious to everyone, but it's not that obscure once you understand Perl's precedence.

      So you exchange parens for square brackets and add an arrow instead. Sorry, but you really haven't proven your point. They are both non-obvious until you understand how Perl handles precedence and lists. caller(0)[0] fails because you are trying to index a scalar, not a list.
        > fails because you are trying to index a scalar

        No,it fails because it's undefined syntax

        syntax error ... near ")["

        and indexing a list always requires parens!

        see perldata

        A list value may also be subscripted like a normal array. You must +put the list in parentheses to avoid ambiguity.

        Cheers Rolf

Re^5: Line numbers
by LanX (Sage) on Mar 17, 2012 at 00:07 UTC
    Well he rather meant "intuitive", all examples are about precedence.

    Cheers Rolf

Re^5: Line numbers
by gg48gg (Sexton) on Mar 17, 2012 at 01:46 UTC

    Right. The added complexity actually comes from introducing the say function, which takes a list.

    say (caller(0))[0];

    is expanding to:

    say $package, $filename, $line, $subroutine, $hasargs,$wantarray, $eva +ltext, $is_require, $hints, $bitmask, $hinthash,[0];

    This gives you the syntax error:

    say [0];
      > is expanding to:

      > say $package, $filename, $line, $subroutine, $hasargs,$wantarray, $evaltext, $is +_require, $hints, $bitmask, $hinthash,[0];

      nope, and you're showing valid code! After the last comma comes a literal arrayref [0].

      DB<100> print $a,[0]; ARRAY(0x84e16b8)

      the syntax-error comes from appending [0] unseparated to a function call say().

      and nothing is "expanded" at parsing time.

      Cheers Rolf

        Thanks for setting me straight Rolf. I was getting an error because I didn't have the say feature enabled. I guess I shouldn't have stated it so matter-of-fact. I was so sure I had it figured out.

        I am still a little confused about this and why anonymous' code works...

        print '', (caller(0))[0];

        and why this gets a syntax error:

        print (caller(0))[0];
      Actually, this is wrong!
      When you say: print (caller(0))[0], print is interpretated as a function (equaivalent to print('hi')[0]), but it works fine if you say: print '', (caller(0))[0]

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (1)
As of 2022-01-23 02:47 GMT
Find Nodes?
    Voting Booth?
    In 2022, my preferred method to securely store passwords is:

    Results (63 votes). Check out past polls.