我有下一个程序:
use warnings;
use strict;
BEGIN {
print \&mysub;
}
sub mysub {};
print \&mysub;
其输出:
CODE(0x118e890)CODE(0x118e890)
该BEGIN
块在编译时处理。此时,sub mysub
编译器尚未看到的定义。但是程序仍然会打印正确的子例程地址,该地址将在定义时具有。
为什么我在这里没有出错?这是某种自我生存吗?
是的,这是一种自我生存的形式。当需要引用该子项并且该子项不存在时,将创建一个存根。
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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句