Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

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

by anazawa (Scribe)
on Aug 21, 2012 at 07:58 UTC ( #988630=note: print w/ replies, xml ) Need Help??


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

When we execute my code above, the script throws an exception because &{ 'run' } violates "strict refs". Khen1950fx explained how to avoid this problem (I appreciate his suggestion).

On the other hand, when we comment out &{ 'run' }, my script doesn't output error messages. This result shows the following doesn't violate "strict refs":
my $walkable = defined &{ 'walk' }; undef &{ 'walk' };
It seems each line uses symbolic references. I don't understand why this is possible.


Comment on Re^6: undef/defined &{$name} while "strict refs"
Select or Download Code
Replies are listed 'Best First'.
Re^7: undef/defined &{$name} while "strict refs"
by Anonymous Monk on Aug 21, 2012 at 08:25 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://988630]
help
Chatterbox?
and the web crawler heard nothing...

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