为什么我可以在声明没有错误之前获取子程序地址?

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编译器还没有看到定义.但是程序仍会打印正确的子程序地址,它在定义时会有.

为什么我这里没有错误?这是某种自动化吗?

ike*_*ami 4

是的,这是一种自动生存的形式。当需要对子对象的引用并且子对象不存在时,就会创建存根。

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)