私は、これはグローバルなハッシュリファレンスでなければなりませんと仮定します。
my $hash;
ループ10はローカルスコープのハッシュリファレンスの$ localrefを作成するトラフ1を行きます:
foreach $a (1..10) {
my $localref = {"test"=> 1};
の$ localrefは今{test => 1}
を含むハッシュリファレンスのメモリアドレスへのポインタです。それを見るためにprint
コマンドを追加しよう:
print $localref;
あなたはメモリアドレスが各ループの実行のための変化を示すことがわかります。
$hash->[$a] = $localref; # does this result in copy?
}
$hash->[$a]
配列リファレンスとして$ハッシュという変数を使用しています。名前を変更することを検討する必要があります。ループの後にあなたの「グローバル」$ハッシュの内容を示す
試してみてください。
for (1..10) {
print $_."\t".$hash->[$_];
}
あなたはまだ生きているすべての参照が表示されます。
内容を表示するために使用するデータ:: Dumperを:
use Data::Dumper;
print Dumper($hash);
最終的な結論:
あなたのハッシュリファレンスを保存するメモリ位置が常に同じまま、内容がコピーされることはありませんが、参照(アドレス情報)がコピーされる。同じ場所への2つの参照は、短い時間の間、$hash->[$a] = $localref;
と}
の間に存在します。
PS:によって使用されたメモリは、それ以上参照が存在しなくなるとすぐに解放されます。
ちょっと書いておきますが、配列としてハッシュとしてではなく$ hashにアクセスしています( '$ hash - > {$ a} = $ localref'が正しいことになります) – eballes
あなたのコードグローバルハッシュやその他のグローバル変数を含んでいません。 – mob