Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options

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"

Replies are listed 'Best First'.
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?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://988617]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (7)
As of 2018-04-27 08:53 GMT
Find Nodes?
    Voting Booth?