2009-08-06 13 views

risposta

30

Se si intende prendere l'unione dei loro dati, basta fare:

%c = (%a, %b); 
+0

Perché non% a = (% a,% b); lavoro? % a viene "cancellato" – biznez

+3

Funziona per me: "% a = ('a' => 'b', 'c' => 1);% b = ('c' => 'd');% a = (% a,% b); print join (',', map {"'$ _' => \" $ {a {$ _}} \ ""} chiavi% a), "\ n"; " Gli articoli da% b con la stessa chiave hanno la precedenza, ma dopo il sindacato sono presenti altri elementi da% a. – outis

+4

@yskhoo: funziona. – ysth

23

È anche possibile utilizzare le fette di fondere un hash in un altro:

@a{keys %b} = values %b; 

Nota che gli elementi in% b sarà sovrascrivi gli elementi in% a che hanno la stessa chiave.

+5

Per credito extra, con un ref hash in aeb, facciamo @ {$ a} {chiavi% $ b} = valori% $ b; – daotoad

+2

Mi aspetto che questo sia più efficiente dell'altra risposta, perché quello ricrea l'hash anche per gli elementi già esistenti, mentre questo aggiunge solo le chiavi per i nuovi elementi. Se c'erano molti articoli in% a, rispetto a% b, la differenza può essere rispettabile. – bart

+1

Forse. Il mio approccio percorre anche% b due volte. Se% b è maggiore di% a, l'altra tecnica potrebbe essere più veloce. Il più veloce di tutti potrebbe essere un ciclo, ma l'OP non lo voleva. – outis

2

Questo unirà gli hash e terrà conto anche delle voci non definite, in modo che non sostituiscano il contenuto.

my %hash = merge(\%hash1, \%hash2, \%hash3); 

sub merge { 
    my %result; 

    %result = %{ $_[0] }; 
    shift; 

    foreach my $ref (@_) { 
     for my $key (keys %{$ref}) { 
      if (defined $ref->{$key}) { 
       $result{$key} = $ref->{$key}; 
      } 
     } 
    } 

    return %result; 
} 
2
my %c = %a; 
map {$c{$_} = $b{$_}} keys %b; 
Problemi correlati