0

我试图将哈希的引用传递到另一个模块中定义的子例程中以提高性能。在此其他模块的子例程中,引用被取消引用为:

sub subRoutine{
    my $hash_ref = $_[0];
    my %hash = %$hash_ref;

    $hash{$a_key} = $a_value;
}

因此,这会更改此模块中该键的值,但不会更改调用此子例程的 perl 程序中的值。是什么原因,我该如何避免这种情况?使用引用而不是传递散列/返回散列以提高性能是否正确?

提前致谢!最良好的祝愿!

4

3 回答 3

4

不要取消引用到本地副本,只需使用引用:

$hash_ref->{$a_key} = $a_value;
于 2013-01-20T20:47:10.333 回答
4

如果您想像这里一样操作原始变量,则传递引用很好。问题是您正在立即创建引用哈希的副本,并对副本进行操作。

该行my %hash = %$hash_ref;正在创建一个新的哈希并从原始哈希中复制所有键/值对。当您更改此副本时,它对原件没有影响。

只需摆脱该行,并将该行替换$hash{$a_key} = $a_value;$hash_ref->{$a_key} = $a_value;. 您现在指的是原始哈希的一个元素,并对其进行更改。

于 2013-01-20T20:49:27.427 回答
3

当您说 时%hash = %$hash_ref,您将其取消引用到本地副本(子例程范围)。如果要更改传递给子例程的哈希值,请使用

$hash_ref->{$a_key} = $a_value.

于 2013-01-20T20:48:14.657 回答