Perl ändern hash-Referenz im Unterprogramm
Ich habe Probleme beim Verständnis der hash-Referenzen und die änderung der hash im Ort, anstatt es. Ich möchte schreiben eine sub-routine, die einen Wert zurückgeben von hash-und auch ändern Sie den hash. Ich war vor einigen Fragen, während Sie die Kodierung für Sie. Also schrieb ich das folgende basic-code zu verstehen, das ändern der hash im Ort.
#!/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;
Den Ausgang zu beobachten ist:
There:$VAR1 = {
'check' => 1
};
$VAR1 = 'check';
$VAR2 = 2;
$VAR1 = [
1,
2,
3
];
here
$VAR1 = 'check';
$VAR2 = 1;
$VAR1 = 1;
$VAR2 = 2;
$VAR3 = 3;
Aus der Ausgabe, die ich daraus gefolgert werden, dass änderungen an hashDeref nicht das ändern der Daten in der Referenz. Ist mein Verständnis richtig? Gibt es eine Möglichkeit, ändern Sie die hash-variable im Ort, anstatt es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist so eine (flache) Kopie von
%hashVal
:Den hash-ref
$hashRef
noch Punkte%hashVal
aber%hashDeref
nicht, es ist nur eine Kopie. Wenn Sie möchten, ändern Sie die übergebenen hash-ref, in-place, arbeiten dann mit der übergebenen hash-ref:Verlassen, dass Ihre änderungen in
%hashVal
. Im array den Fall, Sie machen nie eine Kopie, die Sie gerade dereferenzieren es in-place:und die änderung
$arrVal
zeigt sich in@arrVal
.