2012-04-13 9 views
7

Mam trudności ze zrozumieniem odwołań do hasza i zmianą hasza zamiast zwracania go. Chcę napisać podprogram, który zwróci wartość z hasza, a także zmodyfikuje hasz. Miałem problemy podczas pisania kodu. Napisałem więc poniższy podstawowy kod, aby zrozumieć modyfikowanie hasza w miejscu.Poprawienie odwołania mieszania Perla w podprogramie

#!/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; 

Wyjście obserwowane jest:



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

Z wyjścia, mogę wywnioskować, że zmiany nie są hashDeref modyfikowania danych w odniesieniu. Czy moje zrozumienie jest poprawne? Czy istnieje sposób na zmodyfikowanie zmiennej hash zamiast jej zwrócenia.

Odpowiedz

18

to robi (płytkie) kopii %hashVal:

my %hashDeref = %{$hashRef}; 

Hasz-ref $hashRef nadal wskazuje %hashVal ale %hashDeref nie robi, to tylko kopia. Jeśli chcesz zmodyfikować przeszedł hash-ref w miejscu, a następnie pracować z przeszła hash-ref:

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

która pozostawi zmiany w %hashVal. W przypadku tablicy, nigdy nie zrobić kopię, wystarczy dereference to na miejscu:

push(@{$arrVal}, 3); 

a zmiana $arrVal pokazuje się w @arrVal.

+0

Dziękuję "mu jest za krótki" – Sid

Powiązane problemy