2012-04-13 68 views
7

我无法理解哈希引用并在原地更改哈希,而不是返回它。我想写一个子例程,它将从散列中返回一个值并修改散列。编码时我遇到了一些问题。所以,我写了下面的基本代码来理解修改哈希的地方。在子程序中修改哈希引用的Perl

#!/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不修改所述参考的数据。我的理解是否正确?有没有办法修改散列变量而不是返回它。

回答

18

这使得%hashVal一(浅)副本:

my %hashDeref = %{$hashRef}; 

哈希裁判$hashRef仍指向%hashVal%hashDeref不,它只是一个副本。如果要修改就地传递哈希裁判,然后用通过哈希裁判工作:

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

,这将会使你的变化%hashVal。在阵的情况下,你永远做一个副本,你只是取消对它的引用就地:

push(@{$arrVal}, 3); 

和变化$arrVal@arrVal显示出来。

+0

谢谢“mu太短” – Sid 2012-04-13 08:01:04