2012-04-13 6 views
7

Ich habe Probleme, die Hash-Referenzen zu verstehen und den Hash an Ort und Stelle ändern, anstatt es zurückzugeben. Ich möchte eine Subroutine schreiben, die einen Wert von Hash zurückgibt und auch den Hash ändert. Beim Codieren hatte ich einige Probleme. Also habe ich den folgenden grundlegenden Code geschrieben, um zu verstehen, wie man den Hash an Ort und Stelle verändert.Perl ändern Hash-Referenz in 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; 

Der Ausgang beobachtet wird:



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

Vom Ausgang, I geschlossen, dass Änderungen an hashDeref werden die Daten nicht in der Referenz modifizieren. Ist mein Verständnis richtig? Gibt es eine Möglichkeit, die Hash-Variable an Ort und Stelle zu ändern, anstatt sie zurückzugeben.

Antwort

18

Dies macht eine (flache) Kopie von %hashVal:

my %hashDeref = %{$hashRef}; 

Der Hash-ref $hashRef noch %hashVal weist aber %hashDeref nicht, es ist nur eine Kopie. Wenn Sie das übergebenen Hash-ref an Ort und Stelle ändern mögen, dann arbeitet mit dem übergebenen Hash-ref:

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

, dass die Änderungen in %hashVal verlassen. Im Array Fall machen Sie nie eine Kopie, die Sie gerade dereferenzieren es an Ort und Stelle:

push(@{$arrVal}, 3); 

und die Änderung $arrVal zeigt in @arrVal auf.

+0

Danke "mu ist zu kurz" – Sid

Verwandte Themen