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 に答える