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

Re^7: undef/defined &{$name} while "strict refs"

by Anonymous Monk
on Aug 21, 2012 at 08:25 UTC ( #988639=note: print w/ replies, xml ) Need Help??


in reply to Re^6: undef/defined &{$name} while "strict refs"
in thread undef/defined &{$name} while "strict refs"

Well , yes, this part I understood when I answered Re^2: undef/defined &{$name} while "strict refs"

The answer according to strict is that its an exception made for AUTOLOAD


Comment on Re^7: undef/defined &{$name} while "strict refs"
Replies are listed 'Best First'.
Re^8: undef/defined &{$name} while "strict refs"
by Athanasius (Abbot) on Aug 21, 2012 at 08:33 UTC

    No, here is the relevant quote from the documentation for the strict pragma:

    strict refs This generates a runtime error if you use symbolic references (see per +lref). ... There is one exception to this rule: $bar = \&{'foo'}; &$bar; is allowed so that goto &$AUTOLOAD would not break under stricture.

    and here is code demonstrating the problem:

    >perl -Mstrict -e "sub walk {} sub run {} my $walkable = defined(&{'wa +lk'}); my $runnable = &{'run'};" Can't use string ("run") as a subroutine ref while "strict refs" in us +e at -e line 1.

    So, the question is: How does the documented exception for use strict 'refs', which allows use of a reference to a symbolic sub, explain the observed fact that when defined is applied to the sub itself (not a reference), no runtime error is raised?

    Or, conversely: If the expression &{'walk'} is legal as an argument to defined, why is the expression &{'run'} illegal as the right-hand-side of an assignment?

    How (and why) does Perl distinguish between these two cases?

    Athanasius <°(((><contra mundum

      Ooooooh, well that could be called a bug

      But if you ask me, both 'run' and 'walk' being string constants, well, I don't see why either &{'run'} or &{'walk'} should be illegal

      Athanasius clarified what I wanted to say. Thanks a lot :) By the way, the following is equivalent to the code in question:
      no strict 'refs'; my $walkable = defined *{ 'walk' }{CODE};
      In this case, "no strict refs" is required and it seems reasonable. Should we cosider defined &{ 'walk' } not to be a recommended expression?

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (13)
As of 2015-07-29 20:19 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 (268 votes), past polls