Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re^2: Grabbing Variable Names

by mab (Acolyte)
on Mar 30, 2005 at 19:17 UTC ( [id://443582]=note: print w/replies, xml ) Need Help??


in reply to Re: Grabbing Variable Names
in thread Grabbing Variable Names

Hi,

I'm very interested in your comments about determining if a function has been forward declared but not yet loaded, e.g., when using AutoLoader. For some reason, though, I can't get this to work. Here's my test case:
sub hello; *fn = $::{'hello'}; print "declared\n" if *fn{CODE}; print "not defined\n" if ! defined &fn; print "exists\n" if exists &fn; print "glob exists\n" if exists $::{'hello'};
For me, this test correctly prints "not defined" and "glob exists" but shouldn't it also print "declared" and "exists?"

Thanks for any insight you can give me on this.

Best,
Mike

Replies are listed 'Best First'.
Re^3: Grabbing Variable Names
by ihb (Deacon) on Mar 30, 2005 at 21:19 UTC

    Long story short is that a forward declaration doesn't create a glob. You can try this by doing

    sub foo; print ref \$::{foo}; # "SCALAR" sub bar { 1 }; print ref \$::{bar}; # "GLOB" sub baz; print ref \$::{baz}; # "GLOB" $baz = $baz; # Just to mention the symbol "baz".
    As it turns out if you inspect this a bit further the prototype of the subroutine (or "-1" if no prototype) is stored instead of a glob if no glob has been created already. When a symbol with the same name as the forward declaration a glob is created. So when you do *fn = $::{hello} you actually assign -1 to *fn making *fn aliased to *{-1}. (*{something} is just the "safe" way to write *something for symbols that aren't generally recognized as symbols by Perl and can be used with any sigil, like &{subname}.)
    sub foo; *{-1} = sub { 'oh' }; # Create a sub called "-1". print &{-1}(); # "oh" *bar = $::{foo}; # Really? print defined &bar; # "1" Huh? So now &bar is defined # even though &foo isn't? print bar(); # "oh" #$foo; # But all this would change if you # uncommented "$foo;".
    Sneaky, eh?

    ihb

    See perltoc if you don't know which perldoc to read!

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (5)
As of 2024-03-29 06:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found