Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

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

by Somni (Friar)
on Oct 29, 2007 at 02:08 UTC ( [id://647778]=note: print w/replies, xml ) Need Help??


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

Strange and rare? A simple dispatch table illustrates taking a reference before a function is seen, as the table typically comes before subroutines.

my %OPS = ( frob => \&frobnicate, knob => \&knobnicate, ); sub frobnicate { ... } sub knobnicate { ... }

As for a reference evaluating to undef, the concept seems wrong. If a reference can't be taken it should be an error; if it can, you should get a reference. Are there any examples of this behavior in Perl now?

  • Comment on Re^5: OO-call bug uncovered & autovivified functions: defined? exists?
  • Download Code

Replies are listed 'Best First'.
Re^6: OO-call bug uncovered & autovivified functions: defined? exists?
by ikegami (Patriarch) on Oct 29, 2007 at 02:09 UTC

    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 { '...' }
      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.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others examining the Monastery: (2)
As of 2024-04-26 04:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found