我试图将哈希的引用传递给另一个模块中定义的子例程,以提高性能。在此其他模块的子例程中,引用被解除引用为:
sub subRoutine{
my $hash_ref = $_[0];
my %hash = %$hash_ref;
$hash{$a_key} = $a_value;
}
因此,这会更改此模块中该键的值,但它不会更改调用此子例程的perl程序中的值。是什么原因,我该如何避免这种情况?使用引用而不是传递散列/返回散列以提高性能是否正确?
提前致谢! 祝福!
答案 0 :(得分:4)
不要取消引用本地副本,只需使用引用:
$hash_ref->{$a_key} = $a_value;
答案 1 :(得分:4)
如果您想要操作原始变量,则传递引用是正常的,就像您在此处一样。问题是您正在创建引用的哈希的副本,并在副本上进行操作。
行my %hash = %$hash_ref;
正在创建一个新哈希并复制原始哈希中的所有键/值对。更改此副本时,它对原始副本没有影响。
删除该行,并将行$hash{$a_key} = $a_value;
替换为$hash_ref->{$a_key} = $a_value;
。您现在指的是原始哈希的一个元素,并将其更改。
答案 2 :(得分:3)
当您说%hash = %$hash_ref
时,您将其解除引用到本地副本(子例程范围)。如果要更改传递给子例程的哈希值,请使用
$hash_ref->{$a_key} = $a_value
。