Perl:子例程中添加的哈希条目丢失



为什么第二次调用printHash时哈希为空?

my %hash = ();
addToHash(%hash);
printHash(%hash);
sub addToHash {
  my %hash = %{$_[0]};
  $hash{"test"} = "test";
  printHash(%hash);
} 
sub printHash {
  print "printHash: n";
  my %hash = %{$_[0]};
  foreach my $key (keys %hash) {
      print "key: $key, value: $hash{$key}n";      
  }
}

输出:

打印哈希:

键:测试

,值:测试

打印哈希:

in

sub addToHash {
  my %hash = %{$_[0]};
  $hash{"test"} = "test";
  printHash(%hash);
}

my %hash创建一个新的哈希,您将参数引用的哈希复制到该哈希中。你想要

sub addToHash {
  my $hr = $_[0];
  $hr->{"test"} = "test";
  printHash($hr);
}

为了修改原始哈希。

因为addToHash函数正在将键值对添加到第一个%hash变量的副本。

my %hash = %{$_[0]}

取消引用 $_[0] 中的哈希引用,但对 my %hash 的赋值会创建哈希内容的新副本。如果您希望addToHash影响输入哈希引用,您仍然需要将其用作哈希引用:

sub addToHash {
    my $hashref = $_[0];
    $hashref->{"test"} = "test";
    printHash( $hashref );
}

请尝试此练习以了解使用哈希和对哈希的引用之间的区别。

%a = (foo => "bar");       # hash
$b = { foo => "bar" };     # reference to hash
%c = %a;                   # new copy of a hash
$c{"foo"} = "baz";         # changes the copy of %a, but not %a
print $a{"foo"};           # still outputs "bar"
$d = $b;                   # $d is reference to same hash that $b points to
$d->{"foo"} = "baz";       # changes $b
print $b->{"foo"};         # now outputs "baz"
$e = %a;                  # $e is a reference to hash %a
$e->{"foo"} = "baz";       # changes %a
print $a{"foo"};           # now outputs "baz"

您的 subrutine 中有本地%hash,因此您不会更改主范围内的本地。

您可能

希望直接使用哈希别名(在您的情况下为 $_[0]

(。

最新更新