私が知る限り、my
演算子は真に字句的スコープの変数を宣言し、動的スコープはlocal
演算子を使用して変数を宣言します。Perlでの語彙スコープと動的スコープの違いは何ですか?
誰でも簡単に説明できますか?
私が知る限り、my
演算子は真に字句的スコープの変数を宣言し、動的スコープはlocal
演算子を使用して変数を宣言します。Perlでの語彙スコープと動的スコープの違いは何ですか?
誰でも簡単に説明できますか?
ローカル($ X)は、グローバル変数$ xの古い値を離れて保存し そのサブルーチンから呼び出され、他の機能に見える あるサブルーチンの持続期間のための新しい値を割り当てます。これは実行時に で行われるため、動的スコープと呼ばれます。 local()は常にパッケージ変数または動的変数と呼ばれるグローバル変数 に影響します。
my($ x)は、現在の サブルーチンでのみ表示される新しい変数を作成します。これはコンパイル時に行われるため、字句解析または スタティックスコープと呼ばれます。 my()は常に、 字句変数または(不適切な)静的(有効範囲)変数とも呼ばれる私的変数に影響します。
はPerl-FAQ'sを見てみましょう:
my
は、ローカル変数を作成します。local
はありません。
簡単な例を追加します。
$var = "Global";
sub inner {
print "inner: $var\n";
}
sub changelocal {
my $var = "Local";
print "changelocal: $var\n";
&inner
}
sub changedynamic {
local $var = "Dynamic";
print "changedynamic: $var\n";
&inner
}
&inner
&changelocal
&changedynamic
これは、次の出力(コメントが追加されました)を示します。
ダイナミック変数は、呼び出した関数のグローバルをマスクする方法と考えることができます。レキシカルスコープ変数は、最も近い中カッコ内のコードからしか表示されません。
ありがとうございました – Anil
"my($ x)は現在のサブルーチンでのみ表示される新しい変数を作成します"。それは本当ではありません。 'my'は現在の*コードブロックでしか見えない新しい変数を作成します。サブルーチンはブロックの一例に過ぎません。あなたは 'local'の定義において同様のエラーを出します。 –
@ O.D http://perldoc.perl.org/perlsyn.html#Basic-BLOCKs – TLP