web-dev-qa-db-fra.com

Comment puis-je combiner des hachages en Perl?

Quel est le meilleur moyen de combiner les deux hachages dans% hash1? Je sais toujours que% hash2 et% hash1 ont toujours des clés uniques. Je préférerais aussi une seule ligne de code si possible.

$hash1{'1'} = 'red';
$hash1{'2'} = 'blue';
$hash2{'3'} = 'green';
$hash2{'4'} = 'yellow';
91
mleykamp

Réponse rapide (TL; DR)

 
% hash1 = (% hash1,% hash2) 
 
 ## ou sinon ... 
 
 @ hash1 { clés% hash2} = valeurs% hash2; 
 
 ## ou avec références ... 
 
 $ hash_ref1 = {% $ hash_ref1,% $ hash_ref2}; 
 

Vue d'ensemble

  • Contexte: Perl 5.x
  • Problème: L'utilisateur souhaite fusionner deux hachages1 en une seule variable

Solution

  • utilisez la syntaxe ci-dessus pour les variables simples
  • utiliser Hash :: Merge pour des variables imbriquées complexes

Les pièges

Voir également


Notes de bas de page

1 * (aka associative-array , aka dictionnaire )

160
dreftymac

Départ perlfaq4: Comment fusionner deux hachages . La documentation Perl contient déjà de nombreuses informations utiles et vous pouvez les obtenir tout de suite plutôt que d’attendre que quelqu'un d’autre réponde. :)


Avant de décider de fusionner deux hachages, vous devez décider quoi faire si les deux hachages contiennent des clés identiques et si vous souhaitez conserver les hachages d'origine tels quels.

Si vous souhaitez conserver les hachages d'origine, copiez un hachage (% hash1) dans un nouveau hachage (% new_hash), puis ajoutez les clés de l'autre hachage (% hash2 au nouveau hachage. Vérifier que la clé existe déjà dans% new_hash vous donne une chance de décider quoi faire avec les doublons:

my %new_hash = %hash1; # make a copy; leave %hash1 alone

foreach my $key2 ( keys %hash2 )
    {
    if( exists $new_hash{$key2} )
        {
        warn "Key [$key2] is in both hashes!";
        # handle the duplicate (perhaps only warning)
        ...
        next;
        }
    else
        {
        $new_hash{$key2} = $hash2{$key2};
        }
    }

Si vous ne voulez pas créer un nouveau hachage, vous pouvez toujours utiliser cette technique de bouclage; remplacez simplement% new_hash par% hash1.

foreach my $key2 ( keys %hash2 )
    {
    if( exists $hash1{$key2} )
        {
        warn "Key [$key2] is in both hashes!";
        # handle the duplicate (perhaps only warning)
        ...
        next;
        }
    else
        {
        $hash1{$key2} = $hash2{$key2};
        }
    }

Si vous ne vous souciez pas du fait qu'un hachage écrase les clés et les valeurs de l'autre, vous pouvez simplement utiliser une tranche de hachage pour ajouter un hachage à un autre. Dans ce cas, les valeurs de% hash2 remplacent les valeurs de% hash1 lorsqu'elles ont des clés communes:

@hash1{ keys %hash2 } = values %hash2;
38
brian d foy

C’est une vieille question, mais c’est ce qui ressort le plus fréquemment dans ma recherche sur Google pour 'Perl merge hashes' - et pourtant, il ne mentionne pas le module très utile de CPAN Hash :: Merge

14
LeeGee

Pour les références de hachage. Vous devez utiliser des accolades comme suit:

$hash_ref1 = {%$hash_ref1, %$hash_ref2};

et not la réponse suggérée ci-dessus en utilisant des parenthèses:

$hash_ref1 = ($hash_ref1, $hash_ref2);
5
JeanieJ