in reply to Autoloading and anonymous subs

Does $Foo::foo->() not mean locate the sub in the package Foo?

No. $Foo::foo is a symbol living in the symbol table Foo, that's granted; but its contents must not neccessarily refer to package Foo. So the normal method lookup rules apply. Which means that AUTOLOAD in the package main is found first.

update: If the content of $Foo::foo is a sub reference in the Foo namespace, the Foo AUTOLOAD is found, eg

$Foo::foo = \&Foo::bar; print $Foo::foo->(); # Foo

--shmem

_($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                              /\_¯/(q    /
----------------------------  \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}

Replies are listed 'Best First'.
Re^2: Autoloading and anonymous subs
by rir (Vicar) on Jun 28, 2007 at 21:04 UTC
    How do you take the address of a sub that needs to be AUTOLOADed before it is AUTOLOADed? Hmmm?

    Be well,
    rir

      *shrug* I just do. It's a magic called autovivification :-P
      You can take a reference to a sub that doesn't exist. It's much like forward declarations of subs:
      package Foo; sub bar; # we'll define that later \&bar; # same effect

      In fact, that's how AutoLoader works - it loads a modules autosplit.ix file which contain forward declarations of subs to be loaded. The CODE slot of the typeglob is allocated, but it's empty. That's why calling such a sub AutoLoader's AUTOLOAD is called, which requires the sub's source file on the fly.

      --shmem

      _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                    /\_¯/(q    /
      ----------------------------  \__(m.====·.(_("always off the crowd"))."·
      ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
Re^2: Autoloading and anonymous subs
by haoess (Curate) on Jun 27, 2007 at 22:58 UTC

    And it's always the main package:

    package Foo; sub AUTOLOAD { __PACKAGE__ } print $foo->(); package main; sub AUTOLOAD { __PACKAGE__ } __END__ main

    I just can't find the documentation for this behaviour.

    -- Frank

      You are calling an undefined coderef. This coderef (which isn't, being just nothing, or not existing) has no association with any package, albeit the variable holding "that nothingness" (if nothing can be something) has. Now, how should perl resolve that sensibly? There's no package, there's no code, there's no sub. Hence the default package (main), and as last resort, AUTOLOAD.

      The documentation is implicit in perlsub, perlref, ...

      --shmem

      _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                    /\_¯/(q    /
      ----------------------------  \__(m.====·.(_("always off the crowd"))."·
      ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}