2013-04-08 206 views
1

清除值如果我有作爲散列參考定義:的Perl:在嵌套散列

my %hash1=(
    "a" => 1, 
    "b" => 2, 
    "c" => { 
       "d" => 4, 
       "e" => 5 
      } 
    ); 

my $r_hash1 = \%hash1; 

將使用:

$r_hash1->{c}=(); 

要清除%HASH1 {C}的密鑰進行再利用清潔?

如果是這樣,我也想知道,如果我有:

my %hash1=(
    "a" => 1, 
    "b" => 2 
); 

my %hash2=(
    "d" => 4, 
    "e" => 5 
); 

my $r_hash1 = \%hash1; 
my $r_hash2 = \%hash2; 

$r_hash1->{"c"} = $r_hash2; 

無論使用:

$r_hash1->{c}=(); 

將釋放重用使用%HASH2的內存肯定它會使用在散列上下文中:

%$r_hash1->{c} 

但是,這將看哈希上下文中的$ r_hash1,而不是內容$ r_hash1 - > {C}。

謝謝。

+0

在第二個問題中,你正在定義$ r_hash1兩次,我想你的意思是定義'my $ r_hash2 = \%hash2;' – imran 2013-04-08 17:05:43

+0

Thanks - 編輯 – Caw 2013-04-08 18:25:16

回答

5

如果要空出一個嵌套的散列(但仍然有散存在),那麼你需要取消對它的引用第一:

%{ $r_hash1->{c} } = (); 

或者,你可能只是在它的位置分配一個空hashref:

$r_hash1->{c} = { }; 

在你的第二個例子,如果你設置$r_hash1->{c} = $r_hash2,然後用%{ $r_hash1->{c} } = ()清除它,在%hash2的東西會被清除。這是因爲您正在提取$r_hash1->{c},這是$r_hash2的副本,其參考%hash2

這裏有一個簡單的程序,這表明了結果:

perl -MData::Dumper -E '%h1 = (a => 1, b => 2); %h2 = (d => 4, e => 5); $h1{c} = \%h2; say Dumper \%h1; %{ $h1{c} } = (); say Dumper \%h1; say Dumper \%h2' 
$VAR1 = { 
      'c' => { 
        'e' => 5, 
        'd' => 4 
       }, 
      'a' => 1, 
      'b' => 2 
     }; 

$VAR1 = { 
      'c' => {}, 
      'a' => 1, 
      'b' => 2 
     }; 

$VAR1 = {}; 

這也是略有縮減(我沒有與中間命名引用打擾。)第一個轉儲顯示%h1其參考%h2。第二個轉儲顯示%h1,然後解引用並清除它。第三個轉儲清除後顯示原始的%h2

另一方面,如果您使用$h1{c} = { },原來的%h2將不受影響,因爲您只是替換$h1{c}的值。它最初是對%h2的引用;現在它是對一個新的匿名散列的引用。

+0

謝謝,不確定使用{}會影響優先級;抱歉,錯過了一條線 - 糾正了它。 – Caw 2013-04-08 17:02:30

+0

更新了答案。 – friedo 2013-04-08 17:10:41

+0

太好了,非常感謝 – Caw 2013-04-08 17:16:11