Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re: subroutine refs

by broquaint (Abbot)
on Nov 30, 2007 at 18:19 UTC ( #654158=note: print w/ replies, xml ) Need Help??


in reply to subroutine refs

You can safely create a reference to a subroutine by name and the execute that e.g

use strict; sub dynamic { print "Mmm, dynamic.\n"; } my $name = 'dynamic'; my $subref = \&$name; &$subref();
HTH

_________
broquaint


Comment on Re: subroutine refs
Download Code
Replies are listed 'Best First'.
Re^2: subroutine refs
by blokhead (Monsignor) on Nov 30, 2007 at 18:50 UTC
    I find this very surprising. But I checked it and it apparently works.

    Why does this give an error:

    use strict; sub dynamic { print "hello\n"; } my $name = "dynamic"; &$name();
    .. and yet this is ok? (they differ only in the last line)
    use strict; sub dynamic { print "hello\n"; } my $name = "dynamic"; &{ \&$name }();
    Before seeing this, I would have bet anything that the &{\&{ ... }} operation was absolutely the same as &{...} (barring weird action-at-a-distance caused by tying, overloading, etc). In fact, I'm not sure whether to consider this a bug or not. Indeed, what is \&$name doing other than "using string as a subroutine ref", which is outlawed under strict refs?

    Yet a similar idea with other kinds of refs doesn't do this. Both of these examples fail under strict refs (in my mind because @{\@{...}} is unconditionally the same thing as @{...} ):

    use strict; our @dynamic = ("hello\n"); my $name = "dynamic"; print @$name;
    use strict; our @dynamic = ("hello\n"); my $name = "dynamic"; print @{ \@$name };
    My conclusion is that there is an important distinction between naming a subroutine and invoking it, which is manifested bizarrely by different behaviors in the \&{blah} and &{blah} mechanisms.

    blokhead

Re^2: subroutine refs
by HelenCr (Monk) on Sep 14, 2013 at 11:44 UTC
    broquaint: This is amazing. I was looking for such a solution for a while.

    Thinking about it, is this canonical? (namely, documented)? or is it a quirk (an oversight in the Perl language design?)

      Removing the intermediate assignment to $name, broquaint’s code simplifies to:

      use strict; my $subref = \&{'dynamic'}; &$subref(); sub dynamic { print "Mmm, dynamic.\n"; }

      which is explicitly documented as an exception to the normal behaviour of strict 'refs' (see strict):

      There is one exception to this rule:

      $bar = \&{'foo'}; &$bar;

      is allowed so that goto &$AUTOLOAD would not break under stricture.

      So, yes, this is canonical.

      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://654158]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (8)
As of 2015-07-29 23:28 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (269 votes), past polls