Beefy Boxes and Bandwidth Generously Provided by pair Networks Bob
go ahead... be a heretic
 
PerlMonks  

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

by Athanasius (Prior)
on Aug 21, 2012 at 08:33 UTC ( #988646=note: print w/ replies, xml ) Need Help??


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

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


Comment on Re^8: undef/defined &{$name} while "strict refs"
Select or Download Code
Re^9: undef/defined &{$name} while "strict refs"
by Anonymous Monk on Aug 21, 2012 at 08:45 UTC

    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

Re^9: undef/defined &{$name} while "strict refs"
by anazawa (Beadle) on Aug 21, 2012 at 10:08 UTC
    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://988646]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (4)
As of 2014-04-21 03:58 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (490 votes), past polls