我有下一个程序:

use warnings;
use strict;

BEGIN {
    print \&mysub;
}


sub mysub {};

print \&mysub;

其输出:
CODE(0x118e890)CODE(0x118e890)
BEGIN块在编译时进行处理。此时,编译器尚未看到sub mysub的定义。但是程序仍然会打印正确的子例程地址,该地址将在定义时具有。

为什么我在这里没有出错?这是某种自我生存吗?

最佳答案

是的,这是一种自我生存的形式。当需要引用该子项并且该子项不存在时,将创建一个 stub 。

use strict;
use warnings qw( all );
use feature qw( say );

sub test {
   say  defined(&mysub) ? "defined (".\&mysub.")"
      : exists(&mysub)  ? "exists (".\&mysub.")"
      :                   "doesn't exist";
}

test();
my $ref = \&mysub;
test();
eval("sub mysub { }  1") or die($@);
test();

输出:
doesn't exist
exists (CODE(0xab8cd8))
defined (CODE(0xab8cd8))

10-08 05:22