Sid*_*Sid 9 perl hash subroutine
我无法理解哈希引用并更改哈希值,而不是返回它.我想编写一个子例程,它将从哈希返回一个值并修改哈希值.在编写代码时我遇到了一些问题.所以,我编写了以下基本代码来理解修改哈希的位置.
#!/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;
Run Code Online (Sandbox Code Playgroud)
观察到的输出是:
There:$VAR1 = {
'check' => 1
};
$VAR1 = 'check';
$VAR2 = 2;
$VAR1 = [
1,
2,
3
];
here
$VAR1 = 'check';
$VAR2 = 1;
$VAR1 = 1;
$VAR2 = 2;
$VAR3 = 3;
Run Code Online (Sandbox Code Playgroud)
从输出中我推断,对hashDeref的更改不会修改引用中的数据.我的理解是否正确?有没有办法修改哈希变量而不是返回它.
mu *_*ort 22
这是一个(浅)副本%hashVal:
my %hashDeref = %{$hashRef};
Run Code Online (Sandbox Code Playgroud)
hash-ref $hashRef仍然指向%hashVal但%hashDeref不是,它只是一个副本.如果要在就地修改传递的hash-ref,那么使用传递的hash-ref:
sub checkHashRef{
my ($hashRef, $arrVal) = @_;
$hashRef->{'check'} = 2;
#...
Run Code Online (Sandbox Code Playgroud)
这将留下你的变化%hashVal.在数组中,您永远不会复制,只需将其取消引用即可:
push(@{$arrVal}, 3);
Run Code Online (Sandbox Code Playgroud)
和改变$arrVal显示在@arrVal.