3

perl の const 宣言について質問がありますが、違いがわかりません。違いを教えてください。

以下はコードです:

BEGIN {
  *SIZE = sub() { 2 };
}  
*ITEM = sub() { 10 };

print 'size=', SIZE, "\n";
print 'item=', &ITEM, "\n";

今、問題は、なぜ

  print 'item=', &ITEM, "\n";

行には ITEM の前に「&」が必要ですが、

  print 'size=', SIZE, "\n";   

行の SIZE の前に「&」を付ける必要はありません。

そして、コンパイル時に BEGIN ブロックが実行されることを知っています。

4

3 に答える 3

7

BEGIN ブロックはコンパイル時に実行されるため、コンパイラは への割り当てを認識しますが、 へ*SIZEの割り当て*ITEMはまだ行われていません。

コンパイラは を認識しないため*ITEM、 の呼び出しITEMはあいまいです&。それ以外の場合、コンパイラはそれが「裸の単語」、つまり引用符で囲まれていない文字列である可能性があると考えます。

あなたの場合use strict、コンパイルは裸の単語が関数であると想定します。

use constant手動で行うよりも、定数を宣言するためのより良い方法かもしれません。

于 2012-04-27T11:29:20.060 に答える
2

コード

BEGIN {
  *SIZE = sub() { 2 };
}  
*ITEM = sub() { 10 };

print 'size=', SIZE, "\n";
print 'item=', ITEM, "\n";

エラーがなければ、次のように処理されます。

  • ファイルをコンパイルします。
    • ブロックをコンパイルBEGINします。
      • *SIZE = sub() { 2 };
    • ブロックを実行BEGINします。
      • *SIZE = sub() { 2 };
    • コンパイル*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 に指示する命令であるため、これも機能します。

于 2012-04-27T15:36:06.357 に答える
1

& 接頭辞は、明確に「これは次に来るユーザー定義のサブルーチン呼び出しであること」を意味します。関数名の後に括弧を使用していて、関数名が組み込み関数と競合しない場合、または関数を使用する前に宣言/定義しており、名前が と競合しない場合は、省略できます。内蔵。

続きはこちら

@Sean McMillan の応答を確認してください。

于 2012-04-27T11:30:01.083 に答える