それはfor my $i (...)
する必要がありますので、(まず第一に、$i
は、グローバル変数であってはならない。彼らが使用する特殊変数だから第二に、ではなく、さらに例では、名前$a
と$b
を使用していませんsort
による。)
ブロック}
の終わりに到達したときに$a
、$b
、および$c
が解放されるので、その質問への素朴な答えは、ノーですので、繰り返しの最終的な結果は、メモリの使用でゼロの変化です。
Perlでの実際の実装はさらに賢くです:それはので、それを繰り返し自由に持っているし、メモリの同じ部分を再割り当てしない$a
/$b
/$c
ためのメモリを再利用します。 (もちろん、変数がスコープ外にあっても変数が生きているので、ループ本体を越えて持続するローカル変数の1つへの参照を作成すると、そのことはできません)
これにループを変更することにより、それが事実であることを確認することができます
for my $i (1 .. 5) {
my $x = rand 10;
my $y = rand 10;
my $z = rand 10;
print join(" ", \$x, \$y, \$z), "\n";
}
出力は、メモリ位置は、すべてのループ反復で同一であることを示している
SCALAR(0x4a5788) SCALAR(0x4a5728) SCALAR(0x4a56c8)
SCALAR(0x4a5788) SCALAR(0x4a5728) SCALAR(0x4a56c8)
SCALAR(0x4a5788) SCALAR(0x4a5728) SCALAR(0x4a56c8)
SCALAR(0x4a5788) SCALAR(0x4a5728) SCALAR(0x4a56c8)
SCALAR(0x4a5788) SCALAR(0x4a5728) SCALAR(0x4a56c8)
のようなものになります。
悪くないだけでなく、Perlでは、実際に変数を使用する場所に可能な限り近いところに変数を宣言することが実際には望ましいことです。 – ThisSuitIsBlackNot