Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

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

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


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

I think this doesn't mean we can defined or undef subroutines as well.

I don't understand what you're saying here


Comment on Re^5: undef/defined &{$name} while "strict refs"
Re^6: undef/defined &{$name} while "strict refs"
by anazawa (Scribe) on Aug 21, 2012 at 07:58 UTC

    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.

        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

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (9)
As of 2015-07-03 07:24 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 (48 votes), past polls