2009-08-06 3 views

Répondre

30

Si vous entendez prendre l'union de leurs données, il suffit de faire:

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

Pourquoi pas% a = (% a,% b); travail? % a est "effacé" – biznez

+3

Ça marche pour moi: "% a = ('a' => 'b', 'c' => 1);% b = ('c' => 'd');% a = (% a,% b); print joint (',', map {"'$ _' => \" $ {a {$ _}} \ ""} clés% a), "\ n"; " Les éléments de% b avec la même clé sont prioritaires, mais les autres éléments de% a sont présents après l'union. – outis

+4

@yskhoo: ça marche. – ysth

23

Vous pouvez également utiliser des tranches de fusionner un hachage dans un autre:

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

Notez que les éléments en% B écraser les éléments dans% a qui ont la même clé.

+5

Pour un crédit supplémentaire, avec un hash ref dans a et b, on fait @ {$ a} {keys% $ b} = valeurs% $ b; – daotoad

+2

Je m'attends à ce que ce soit plus efficace que l'autre réponse, parce que celui-ci recrée le hachage aussi pour les éléments déjà existants, alors que celui-ci ajoute juste des clés pour les nouveaux éléments. S'il y avait beaucoup d'items dans% a, comparé à% b, la différence peut être respectable. – bart

+1

Peut-être. Mon approche marche aussi deux fois en% b. Si% b est plus grand que% a, l'autre technique peut être plus rapide. Le plus rapide de tous pourrait être une boucle, mais le PO ne le voulait pas. – outis

2

Cela va fusionner les hachages et prendre en compte les entrées indéfinies, donc elles ne remplacent pas le contenu.

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;