2016-04-26 13 views
2

グローバルハッシュへのコピーを実行するか同じ参照を使用するかどうかはわかりませんが、ローカル参照の値を割り当てるグローバルなperlハッシュがありますが、ブロックへのローカルメモリ。グローバルperlハッシュリファレンスasigment

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $hash; 
foreach $a (1..10) { 
    my $localref = {"test"=> 1}; 
    $hash->[$a] = $localref; # does this result in copy? 
} 
+3

ちょっと書いておきますが、配列としてハッシュとしてではなく$ hashにアクセスしています( '$ hash - > {$ a} = $ localref'が正しいことになります) – eballes

+3

あなたのコードグローバルハッシュやその他のグローバル変数を含んでいません。 – mob

答えて

1

私は、これはグローバルなハッシュリファレンスでなければなりませんと仮定します。

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:によって使用されたメモリは、それ以上参照が存在しなくなるとすぐに解放されます。

+0

ありがとうSebastian、私は参照を印刷しようとした、彼らは同じ参照しています。したがって、たとえそれが別のスコープで作成されたとしても、最後のすべての参照を持たない限り、メモリは解放されません。 – PMat

+0

これは正しい@newguyです。これは、「REFCNT」または参照カウントと呼ばれます。 'REFCNT'が0になると、アイテムは解放されます。 – stevieb

+0

はい。参照変数($ localrefや$ arrayのような)は、住所を保持する名刺に似ています。それを投げ捨てても、この住所の家が失われることはありません。場所はもうわかりませんが、他の人(名刺)は引き続き行うことができます。 – Sebastian

2

$hash実際に配列リファレンスではなく、ハッシュ・リファレンスであり、それ自体が参照されるので、いや、あなたはAREFに代入している要素($localref)は、コピーではありません。それにコピーを作成するには、挿入する前に間接参照する必要があります:%{ $array->[$a] } = %$localref;

+0

はい、上記の例の配列参照です。参照の場合は一般的な意味です。それは私が期待したものですが、$ localrefはローカルメモリです。どのように動作するのですか? – PMat

+1

参照として大きなスコープのアイテムにローカル(すなわち、レキシカル)アイテムを挿入すると、内部変数がスコープから外れない大きなスコープのアイテムがそうするまで。あなたの場合、スコープはグローバルなので、内部の '$ localref'は、プログラムが終了するまでスコープから外れません。 – stevieb

+0

stevieb – PMat

関連する問題