2013-04-08 138 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