Perl修改子例程中的哈希引用

时间:2012-04-13 05:22:53

标签: 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;

观察到的输出是:



    There:$VAR1 = {
          'check' => 1
        };
    $VAR1 = 'check';
    $VAR2 = 2;
    $VAR1 = [
          1,
          2,
          3
        ];
    here
    $VAR1 = 'check';
    $VAR2 = 1;
    $VAR1 = 1;
    $VAR2 = 2;
    $VAR3 = 3;

从输出中我推断,对hashDeref的更改不会修改引用中的数据。我的理解是否正确?有没有办法修改哈希变量而不是返回它。

1 个答案:

答案 0 :(得分:21)

这是%hashVal的一个(浅)副本:

my %hashDeref = %{$hashRef};

哈希引用$hashRef仍然指向%hashVal,但%hashDeref没有,它只是一个副本。如果要在适当位置修改传递的hash-ref,请使用传递的hash-ref:

sub checkHashRef{
   my ($hashRef, $arrVal) = @_;
   $hashRef->{'check'} = 2;
   #...

这会在%hashVal中留下您的更改。在数组中,您永远不会复制,只需将其取消引用:

push(@{$arrVal}, 3);

$arrVal的更改显示在@arrVal