John M. Dlugosz has asked for the wisdom of the Perl Monks concerning the following question:

I want to dynamically load a module (I call require) and then see if a function exists in that module. I don't mean 'can' via inheritance, but whether a direct call to Module::foo would find anything there.

I tried taking a reference to it in an eval block, but found that it never gives an error. I guess you can take a ref to a non-existing sub and it auto-vivafies or something. I'm afraid looking in the %Module:: hash would do the same thing, wouldn't it?

So how can I tell if the function is implemented in that module, without actually calling it?

—John

Replies are listed 'Best First'.
Re: How to tell if a function exists?
by Paladin (Vicar) on Jan 05, 2003 at 02:00 UTC
    print "Exists\n" if exists &subroutine; print "Defined\n" if defined &subroutine;
    From perldoc -f exists
      Ah,
      Given an expression that specifies the name of a subroutine, returns true if the specified subroutine has ever been declared, even if it is undefined.
      OK, so exists tells me if its ever used anywhere and thus in the symbol table (even if never defined), and defined tells me if it was actually present.

      --John

Re: How to tell if a function exists?
by pg (Canon) on Jan 05, 2003 at 02:27 UTC
    Perl does allow you to take reference of non-exist sub.

    Also if this sub becomes defined later, it will be realized.

    A piece of code to demo this:
    apackage.pm: use strict; sub process1 { print "abcd\n"; } 1; test1.pl: my $a = \&process1;#process1 does not exist at this moment print $a, "\n"; require apackage;#process1 is realized. If you comment out this, there + would be an error when you call process1 later. print $a, "\n"; &$a;
      pg, thanks, very informative.

      I gave it a try to play around. If I'm not mistaken, the second line in the test1.pl code should read:

      my $a = \&apackage::process1; #process1 does not exist at this moment

      This ability to reference a non-existent entity made me wonder, what would happen if you point to the "same" non-existent item twice, will those references be the same? So I gave the following a try:

      my $b = \&apackage2::process2; my $c = \&apackage2::process2; my $d = \&apackage2::process3;
      Upon running, as should be, $b and $c both contain the same reference (that is, they compare as equal and print the same reference address). $d is a reference to a different not-yet-existent entity.

      When these entities do get defined - that is, the require is executed such that there is now a real, matching-name subroutine - the pointer address does not change. Also as should be, but interesting (for a newbie) to watch in action.

      Andy

      @_="the journeyman larry disciple keeps learning\n"=~/(.)/gs, print(map$_[$_-77],unpack(q=c*=,q@QSdM[]uRMNV^[ni_\[N]eki^y@))