直接写入perl中另一个模块的子例程中的引用变量

时间:2013-01-20 20:34:42

标签: perl perl-module

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

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

    $hash{$a_key} = $a_value;
}

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

提前致谢! 祝福!

3 个答案:

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