我有下一个程序:
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))