我无法理解散列引用并在适当的位置更改散列,而不是返回它。我想编写一个子例程,它将从散列返回一个值并修改散列。我在编码时遇到了一些问题。因此,我编写了以下基本代码来了解就地修改哈希。
#!/usr/local/bin/perl
#Check hash and array references
#Author: Sidartha Karna
use warnings;
use strict;
use Data::Dumper;
sub checkHashRef{
my ($hashRef, $arrVal) = @_;
my %hashDeref = %{$hashRef};
$hashDeref{'check'} = 2;
push(@{$arrVal}, 3);
print "There:" ;
print Dumper $hashRef;
print Dumper %hashDeref;
print Dumper $arrVal
}
my %hashVal = ('check', 1);
my @arrVal = (1, 2);
checkHashRef(\%hashVal, \@arrVal);
print "here\n";
print Dumper %hashVal;
print Dumper @arrVal;
观察到的输出是:
There:$VAR1 = {
'check' => 1
};
$VAR1 = 'check';
$VAR2 = 2;
$VAR1 = [
1,
2,
3
];
here
$VAR1 = 'check';
$VAR2 = 1;
$VAR1 = 1;
$VAR2 = 2;
$VAR3 = 3;
从输出中,我推断出对 hashDeref 的更改不会修改引用中的数据。我的理解正确吗?有没有办法修改哈希变量而不是返回它。
最佳答案
这是制作 %hashVal
的(浅)副本:
my %hashDeref = %{$hashRef};
哈希引用
$hashRef
仍然指向%hashVal
但是 %hashDeref
没有,它只是一个副本。如果要就地修改传递的哈希引用,请使用传递的哈希引用:sub checkHashRef{
my ($hashRef, $arrVal) = @_;
$hashRef->{'check'} = 2;
#...
这将使您的更改留在
%hashVal
.在数组的情况下,你永远不会复制,你只是在原地取消引用它:push(@{$arrVal}, 3);
并更改为
$arrVal
出现在 @arrVal
.
关于Perl 修改子程序中的散列引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10135642/