6

私は次のプログラムを持っています:

use warnings;
use strict;

BEGIN {
    print \&mysub;
}


sub mysub {};

print \&mysub;

その出力:

CODE(0x118e890)CODE(0x118e890)

ブロックはBEGINコンパイル時に処理されます。その時点で、 の定義はsub mysubコンパイラにはまだ見えません。しかし、プログラムは正しいサブルーチン アドレスを出力します。

ここでエラーが発生しないのはなぜですか? これはある種の自動活性化ですか?

4

2 に答える 2

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();

出力:

doesn't exist
exists (CODE(0xab8cd8))
defined (CODE(0xab8cd8))
于 2017-07-04T16:57:25.827 に答える