Eug*_*kov 6 perl subroutine autovivification
我有下一个程序:
use warnings;
use strict;
BEGIN {
print \&mysub;
}
sub mysub {};
print \&mysub;
Run Code Online (Sandbox Code Playgroud)
它的输出:
CODE(0x118e890)CODE(0x118e890)
Run Code Online (Sandbox Code Playgroud)
该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();
Run Code Online (Sandbox Code Playgroud)
输出:
doesn't exist
exists (CODE(0xab8cd8))
defined (CODE(0xab8cd8))
Run Code Online (Sandbox Code Playgroud)