http://qs321.pair.com?node_id=960092


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

Indeed there is an advantage of the first - I can remember the syntax.

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

Also, the arrayref plays nicer associativity wise. Check this out:

$ perl -E'sub x { say [caller(0)]->[0] } x()' main $ perl -E'sub x { say (caller(0))[0] } x()' syntax error at -e line 1, near ")[" Execution of -e aborted due to compilation errors.

The version with the arrayref just acts more predictably in my mind. I don't have to waste time thinking about it.

perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

Replies are listed 'Best First'.
Re^4: Line numbers
by chromatic (Archbishop) on Mar 17, 2012 at 00:02 UTC
    It is non-obvious why (caller(0))[2] should work but caller(0)[2] should fail.

    Precedence.

      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.
      Well he rather meant "intuitive", all examples are about precedence.

      Cheers Rolf

      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

        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]
Re^4: Line numbers
by LanX (Sage) on Mar 17, 2012 at 00:08 UTC
    Thanks!

    Personally I don't like referencing for immediate dereferencing.

    But that's a matter of taste...

    Anyway I'd rather prefer a clean named argument solution instead of those silly positional parameters of caller.

    Cheers Rolf

        Anyway I'd rather prefer a clean named argument solution instead of those silly positional parameters of caller.

      Devel::StackTrace