12

我无法理解哈希引用和更改哈希,而不是返回它。我想编写一个子例程,它将从哈希返回一个值并修改哈希。我在为它编码时遇到了一些问题。因此,我编写了以下基本代码来理解就地修改哈希。

#!/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 的更改不会修改引用中的数据。我的理解正确吗?有没有办法修改散列变量而不是返回它。

4

1 回答 1

24

这是制作(浅)副本%hashVal

my %hashDeref = %{$hashRef};

hash-ref$hashRef仍然指向%hashVal%hashDeref不指向,它只是一个副本。如果要就地修改传递的 hash-ref,请使用传递的 hash-ref:

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

这将使您的更改保留在%hashVal. 在数组的情况下,你永远不会复制,你只是在原地取消引用它:

push(@{$arrVal}, 3);

并且更改$arrVal显示在@arrVal.

于 2012-04-13T05:38:20.283 回答