Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses

Re^4: How to call a sub-routine ref

by tobyink (Abbot)
on Oct 22, 2012 at 12:35 UTC ( #1000321=note: print w/replies, xml ) Need Help??

in reply to Re^3: How to call a sub-routine ref
in thread How to call a sub-routine ref

There's actually nothing special about undef. Any scalar will do, including references.

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^5: How to call a sub-routine ref
by Corion (Pope) on Oct 22, 2012 at 12:44 UTC

    ... which doesn't make the documentation any less misleading :). I could assume Perl to raise an error if an unblessed reference or a string not specifying a class name appear on the LHS of the arrow operator. Maybe reformulating it as follows makes it match more closely the behaviour:

    Otherwise, the right side is a method name or a simple scalar variable containing the method name, and the left side must be either an object (a blessed reference) or a class name (that is, a package name), see perlobj. As a third case, if the right side is a subroutine reference, the subroutine will be called with the left side unshifted on the parameter list.

      That makes it sound like the left side is only unshifted onto the parameter list in the third cases, but actually it's unshifted in all three cases.

      Also, I'd cut out the talk of classes and just say it needs to be a package name. For example, File::Spec is not a class in the normal sense of the word, but it's a package name that can appear on the left side of the arrow.

      Here's my attempt at explaining ->...

      Otherwise the right side is a bareword method name, or a simple scalar variable containing a method name or coderef. The left side will be evaluated in scalar context and unshifted onto the parameter list, and then the method or coderef will be called. Except where the right side is a coderef, the left side must evaluate to an object (a blessed reference, see perlobj) or a package name - otherwise method resolution (i.e. determining the code to run given a method name) will fail.

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

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1000321]
[stevieb]: I am thankful that I fell into Perl years ago in the manner I did. I don't believe there is another language that people care about so much, that they're willing to give everything. Langs come and go, but in Perl, it seems, things remain consistent.
[stevieb]: The people back then (~2000) are the same people now, but with much more experience. I'm appreciative that I fell into the Perl rabbit hole.
[stevieb]: Coding circles around Python devs, showing how unit tests should be done, enabling easy access to everything, learning basic C to wrap for direct hardware access... I am thankful.
[stevieb]: I'm in an appreciative mood. Thank you fellow Monks, for all I know, and for the knowledge which I can pass on

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (6)
As of 2017-02-25 01:22 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (364 votes). Check out past polls.