103 votes

Comment puis-je combiner des hachages en Perl ?

Quelle est la meilleure façon de combiner les deux hachages dans %hash1 ? Je sais toujours que %hash2 et %hash1 ont toujours des clés uniques. Je préférerais également une seule ligne de code si possible.

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

177voto

dreftymac Points 7843

Réponse rapide (TL;DR)

    %hash1 = (%hash1, %hash2)

    ## or else ...

    @hash1{keys %hash2} = values %hash2;

    ## or with references ...

    $hash\_ref1 = { %$hash\_ref1, %$hash\_ref2 };

Vue d'ensemble

  • Le contexte : Perl 5.x
  • Problème : L'utilisateur souhaite fusionner deux hachages 1 en une seule variable

Solution

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

Pièges

Voir aussi


Notes de bas de page

1 * (alias tableau associatif , alias dictionnaire )

2 votes

Oui, s'il n'y a pas de collisions de clés, @hash1{keys %hash2} = values %hash2 ; est le moyen le plus rapide et le plus court, AFAIK.

48 votes

Pourquoi tu ne peux pas juste faire %hash1 = (%hash1, %hash2)

1 votes

Il semble que cela fonctionne également avec les références : $hash_ref1 = ($hash_ref1, $hash_ref2) ;

40voto

brian d foy Points 71781

Vérifiez perlfaq4 : Comment fusionner deux hashs ? . Il y a déjà beaucoup de bonnes informations dans la documentation Perl et vous pouvez les avoir tout de suite plutôt que d'attendre que quelqu'un d'autre y réponde. :)


Avant de décider de fusionner deux hachages, vous devez décider de ce qu'il faut faire si les deux hachages contiennent des clés identiques et si vous voulez laisser les hachages originaux tels quels.

Si vous souhaitez préserver les hachages d'origine, copiez un hachage (%hash1) vers un nouveau hachage (%new_hash), puis ajoutez les clés de l'autre hachage (%hash2) au nouveau hachage. En vérifiant que la clé existe déjà dans %new_hash, vous pouvez décider de ce que vous allez faire des 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 ; il suffit de remplacer %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 d'un 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 en commun :

@hash1{ keys %hash2 } = values %hash2;

0 votes

Sympa de faire un lien vers perlfaq, et d'autres ressources dans d'autres questions

16voto

LeeGee Points 833

Il s'agit d'une vieille question, mais elle apparaît en bonne place dans ma recherche Google pour 'perl merge hashes' - et pourtant elle ne mentionne pas le module CPAN très utile Hash::Merge

1 votes

La réponse la plus votée a été mise à jour pour inclure ceci.

7voto

JeanieJ Points 189

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

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

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

$hash_ref1 = ($hash_ref1, $hash_ref2);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X