Perl:通过引用传递不会修改哈希

时间:2015-08-07 17:59:17

标签: perl

我的理解是在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

...因为我们通过引用传递哈希。

我在这里想到将哈希传递给函数的概念是什么?

2 个答案:

答案 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;

可能有一种更优雅的方式,但据我所知你想使用哈希引用。