2012-04-13 17 views
7

Non riesco a capire i riferimenti dell'hash e a modificare l'hash, invece di restituirlo. Voglio scrivere una routine secondaria che restituirà un valore dall'hash e modificherà anche l'hash. Stavo affrontando alcuni problemi durante la codifica per questo. Quindi, ho scritto il seguente codice di base per capire come modificare l'hash in atto.Perl modifica del riferimento hash nella 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; 

L'uscita osservata è:



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

Dall'output, ho dedotto che, cambiamenti hashDeref non modificano i dati nel riferimento. La mia comprensione è corretta? C'è un modo per modificare la variabile hash in luogo invece di restituirlo.

risposta

18

Questo sta facendo un (superficiale) copia del %hashVal:

my %hashDeref = %{$hashRef}; 

L'hash-ref $hashRef ancora punta a %hashVal ma %hashDeref non lo fa, è solo una copia. Se si desidera modificare l'hash-ref passata sul posto, poi lavorare con l'hash-ref passato:

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

che lascerà le modifiche nella %hashVal. Nel caso di array, non hai mai fare una copia, basta dereferenziarlo sul posto:

push(@{$arrVal}, 3); 

e la modifica $arrVal si presenta in @arrVal.

+0

Grazie "mu è troppo corto" – Sid

Problemi correlati