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

han*_*nsi 2 perl hash reference subroutine

为什么第二次调用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";      
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

printHash:

关键:测试,价值:测试

printHash:

che*_*ner 7

sub addToHash {
  my %hash = %{$_[0]};
  $hash{"test"} = "test";
  printHash(\%hash);
}
Run Code Online (Sandbox Code Playgroud)

my %hash创建一个新的哈希,您可以复制该参数引用的哈希值.你要

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

为了修改原始哈希.


mob*_*mob 5

因为该addToHash函数正在向第一个变量的副本添加键值对%hash.

my %hash = %{$_[0]}
Run Code Online (Sandbox Code Playgroud)

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

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

尝试这个练习来了解使用散列和散列引用之间的区别.

%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"
Run Code Online (Sandbox Code Playgroud)