in reply to How to tell if a function exists?

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;

Replies are listed 'Best First'.
Re^2: How to tell if a function exists?
by aspen (Sexton) on Jan 05, 2003 at 07:06 UTC
    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@))