为什么第二次调用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]