Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re^6: OO-call bug uncovered & autovivified functions: defined? exists?

by ikegami (Patriarch)
on Oct 29, 2007 at 02:09 UTC ( [id://647779] : note . print w/replies, xml ) Need Help??


in reply to Re^5: OO-call bug uncovered & autovivified functions: defined? exists?
in thread OO-call bug uncovered & autovivified functions: defined? exists?

No, it doesn't. The function gets created by sub before \& is executed.

print "a:", exists(&frobnicate)?1:0, "\n"; # 1 my %OPS = ( frob => \&frobnicate, knob => \&knobnicate, ); BEGIN { print "b:", exists(&frobnicate)?1:0, "\n"; } # 0 sub frobnicate { '...' } sub knobnicate { '...' }

Replies are listed 'Best First'.
Re^7: OO-call bug uncovered & autovivified functions: defined? exists?
by Somni (Friar) on Oct 29, 2007 at 02:38 UTC
    Hm, so it does. The only non-contrived example I can think of is:

    BEGIN { print exists(&frobnicate)?1:0, "\n"; my %OPS = ( frob => \&frobnicate, knob => \&knobnicate, ); sub runops { print $_->(), "\n" for values %OPS } } sub frobnicate { 'frobnicate' } sub knobnicate { 'knobnicate' }

    I have done it in the past in order to keep the dispatch table visible only to the function using it, but I find the extra indentation rather ugly so I tend to avoid it. I don't know if I'd call it strange and rare, but it certainly isn't unexpected. The need for it is also removed in 5.10, but I mention this only so that someone else won't.

    Edit: I realize now this has gotten somewhat far afield of the original question. You asked me to substantiate that if you remove auto-vivification by reference then all subroutines would have to be defined before they can be referred to. It's true, they would need only be declared, not defined, before taking a reference.