我的理解是在Perl中我们通过引用将哈希传递给函数
考虑以下示例,我们修改modifyHash函数中的哈希
#!/usr/local/bin/perl
my %hash;
$hash{"A"} = "1";
$hash{"B"} = "2";
print (keys %hash);
print "\n";
modifyHash(\%hash);
print (keys %hash);
print "\n";
sub modifyHash {
my $hashRef = @_[0];
my %myHash = %$hashRef;
$myHash{"C"} = "3";
print (keys %myHash);
print "\n";
}
此脚本的输出为:
AB
ABC
AB
我原以为:
AB
ABC
ABC
...因为我们通过引用传递哈希。
我在这里想到将哈希传递给函数的概念是什么?
答案 0 :(得分:5)
这是因为当您执行my %myHash = %$hashRef;
时,您正在获取已解除引用的$hashref
的副本并将其放入%myHash
,这与my %myHash = %hash;
相同,所以你根本没有处理引用的哈希值。
要处理引用指定的哈希,请尝试此...
sub modifyHash {
my $hashRef = $_[0];
$hashRef->{"C"} = "3";
print (keys %$hashRef);
print "\n";
}
正如ThisSuitIsBlack在下面的评论中指出的那样,@_[0]
最好写成$_[0]
。您应该始终使用use strict;
和use warnings;
,因为这会被捕获。因为您要发送参考,所以您也可以使用my $hashRef = shift;
。
答案 1 :(得分:1)
问题在于作业:
my %myHash = %$hashRef;
这类似于说:
$x = 5;
$y = $x;
你没有设置$ y来引用内存中的相同位置,你只是将$ x的值赋予$ y。在您的示例中,您将创建一个新哈希(%myHash)并为其提供存储在$ hashRef中的哈希值。未来的任何更改都是新哈希,而不是原始哈希。
如果你想操纵原作,你应该做类似的事情:
${$hashRef}{"C"} = "3";
或
$hashRef->{"D"} = 4;
可能有一种更优雅的方式,但据我所知你想使用哈希引用。