显式散列解除引用与箭头差异

时间:2013-08-14 20:57:03

标签: perl hash reference

考虑简单的Hash of Hash引用。当我解除(内部)哈希值并改变它的一些值时,这不会转移到哈希的原始哈希值。但是用箭头表示法确实如此。我检查箭头符号的地方只是简单的解释,所以给出了什么?

use Data::Dumper;

$HoH{"one"}={'f1' => "junk",
      'f2' => 0};

$href = $HoH{"one"};
%hh=%{$HoH{"one"}};

print Dumper($href);

$href->{'f2'}=1;
$href->{'f1'}="newJunk";

print Dumper($HoH{"one"});

$hh{'f2'}=0;
$hh{'f1'}="oldJunk";

print Dumper($HoH{"one"});

2 个答案:

答案 0 :(得分:5)

此行复制:

%hh=%{$HoH{"one"}};

之后,散列%hh的更改不会反映在hashref $HoH{one}中。

特别是,上面的行是列表赋值的一种形式,它执行复制。没有传递散列引用,如

的情况
$href = $HoH{"one"};

答案 1 :(得分:2)

您的代码中有三个哈希值。

  1. {}创建的匿名版本。 (从现在开始,我将称之为%anon)
  2. %HoH
  3. %hh
  4. $HoH{"one"}={'f1' => "junk",'f2' => 0};
                                # $HoH{one} holds a ref to %anon
    
    $href = $HoH{"one"};        # Copy the ref. $href holds a ref to %anon
    %hh=%{$HoH{"one"}};         # Copy the hash referenced by $HoH{one} (i.e. %anon)
    
    print Dumper($href);        # Dumps the hash referenced by $href (i.e. %anon)
    
    $href->{'f2'}=1;            # Modifies the hash referenced by $href (i.e. %anon)
    $href->{'f1'}="newJunk";    # Modifies the hash referenced by $href (i.e. %anon)
    
    print Dumper($HoH{"one"});  # Dumps the hash referenced by $HoH{one} (i.e. %anon)
    
    $hh{'f2'}=0;                # Modifies %hh
    $hh{'f1'}="oldJunk";        # Modifies %hh
    
    print Dumper($HoH{"one"});  # Dumps the hash referenced by $HoH{one} (i.e. %anon)
    

    为什么修改%hh会影响%anon