Comment ajouter hachage a à hachage b en Perl sans utiliser de boucle?Comment puis-je joindre deux hachages en Perl sans utiliser de boucle?
Répondre
Si vous entendez prendre l'union de leurs données, il suffit de faire:
%c = (%a, %b);
Pourquoi pas% a = (% a,% b); travail? % a est "effacé" – biznez
Ç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
@yskhoo: ça marche. – ysth
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é.
Pour un crédit supplémentaire, avec un hash ref dans a et b, on fait @ {$ a} {keys% $ b} = valeurs% $ b; – daotoad
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
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
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;
}
my %c = %a;
map {$c{$_} = $b{$_}} keys %b;
Pourquoi ne voulez-vous pas utiliser une boucle? –