1

考虑简单的 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"});
4

2 回答 2

5

这一行做了一个副本:

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

之后,对哈希的更改%hh不会反映在 hashref 中$HoH{one}

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

$href = $HoH{"one"};
于 2013-08-14T21:03:03.253 回答
2

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

  1. {}. (从现在开始我将它称为 %anon)
  2. %HoH
  3. %hh

$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

于 2013-08-15T03:12:08.570 回答