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

从perl中的另一个模块直接写入子例程中的引用变量,perl,perl-module,Perl,Perl Module,我试图将散列的引用传递到另一个模块中定义的子例程中,以提高性能。在该子例程中,另一个模块引用被取消引用,如下所示: sub subRoutine{ my $hash_ref = $_[0]; my %hash = %$hash_ref; $hash{$a_key} = $a_value; } 这会改变这个模块中该键的值,但不会改变调用该子例程的perl程序中的值。原因是什么?我如何避免这种情况?为了提高性能,使用引用而不是传递哈希值/返回哈希值是否正确 提前谢谢! 致

我试图将散列的引用传递到另一个模块中定义的子例程中,以提高性能。在该子例程中,另一个模块引用被取消引用,如下所示:

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

    $hash{$a_key} = $a_value;
}
这会改变这个模块中该键的值,但不会改变调用该子例程的perl程序中的值。原因是什么?我如何避免这种情况?为了提高性能,使用引用而不是传递哈希值/返回哈希值是否正确

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

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

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

当您说
%hash=%$hash\u ref
时,您正在将其解引用到本地副本(子例程范围)。如果要更改传递到子例程中的哈希值,请使用


$hash\u ref->{$a\u key}=$a\u value

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

my%hash=%$hash\u ref
正在创建一个新哈希,并从原始哈希复制所有键/值对。更改此副本时,对原始副本没有影响


只需去掉该行,并替换行
$hash{$a_key}=$a_值带有
$hash\u ref->{$a\u key}=$a\u值。您现在引用的是原始散列的一个元素,并对其进行了更改。

谢谢您的解释。