コード
BEGIN {
*SIZE = sub() { 2 };
}
*ITEM = sub() { 10 };
print 'size=', SIZE, "\n";
print 'item=', ITEM, "\n";
エラーがなければ、次のように処理されます。
- ファイルをコンパイルします。
- ブロックをコンパイル
BEGIN
します。
- ブロックを実行
BEGIN
します。
- コンパイル
*ITEM = sub() { 10 };
- コンパイル
print 'size=', SIZE, "\n";
- コンパイル
print 'item=', ITEM, "\n";
- ファイルを実行します。
- 実行する
*ITEM = sub() { 10 };
- 実行する
print 'size=', SIZE, "\n";
- 実行する
print 'item=', ITEM, "\n";
print 'item=', ITEM, "\n";
サブが存在する前にコンパイルされる方法に注意してください。ITEM
サブとして存在する場合、それは許可されます。しかしITEM
、サブとして存在しません。他の意味がない場合、識別子は裸の単語であり、裸の単語は同じ値を持つ文字列にコンパイルされます。
>perl -E"my $x = ITEM; say $x;"
ITEM
>perl -E"my $x = 'ITEM'; say $x;"
ITEM
つまり、特に Perl に別のことをするように頼まない限り:
>perl -E"use strict; my $x = ITEM; say $x;"
Bareword "ITEM" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.
つまり、ITEM
サブコールのように見せる必要があります。
print 'item=', ITEM(), "\n";
&ITEM
&
プロトタイプを無視するように Perl に指示する命令であるため、これも機能します。