Comment puis-je combiner des hachures en Perl?

Quelle est la meilleure façon de combiner les deux hash en %hash1? Je sais toujours que %hash2 et %hash1 ont toujours des Clés uniques. Je préfère également une seule ligne de code si possible.

$hash1{'1'} = 'red';
$hash1{'2'} = 'blue';
$hash2{'3'} = 'green';
$hash2{'4'} = 'yellow';
86
demandé sur dreftymac 2008-12-08 19:13:20

4 réponses

Quick Answer (TL;DR)


    %hash1 = (%hash1, %hash2)

    ## or else ...

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

    ## or with references ...

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

vue d'ensemble

  • Contexte: Perl 5.x
  • problème: l'Utilisateur souhaite fusionner deux hachures 1 en une seule variable

Solution

  • utilisez la syntaxe ci-dessus pour les variables simples
  • utiliser le hachage:: fusionner pour les variables complexes imbriquées

Pièges

  • Que faire lorsque les deux hashes contiennent une ou plusieurs clés dupliquées
    • une paire de clés avec une valeur vide doit-elle jamais remplacer une paire de clés avec une valeur non vide?
    • Qu'est-ce qui constitue une valeur vide vs non vide en premier lieu? (eg. undef , chaîne vide, false , falsy ...)
    • (Note: le la question originale exclut ce scénario, mais il est important de le considérer)

voir aussi


notes de bas de page

1 * (alias associative-array , alias dictionary )

150
répondu dreftymac 2018-02-13 09:21:52

Check out perlfaq4: comment fusionner deux hashes . Il y a beaucoup de bonnes informations déjà dans la documentation Perl, et vous pouvez l'avoir tout de suite plutôt que d'attendre que quelqu'un d'autre répondre. :)


avant de décider de fusionner deux hashes, vous devez décider quoi faire si les deux hashes contiennent des clés qui sont les mêmes et si vous voulez laisser les hashes originaux comme ils étaient.

si vous voulez préserver les hash originaux, copier un hash (%hash1) dans un nouveau hash (%new_hash), puis Ajouter les clés de l'autre hash (%hash2 au nouveau hash. Vérifier que la clé existe déjà en %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 hash, vous pouvez toujours utiliser cette technique de boucle; il suffit de changer le %new_hash en %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 vous en fichez hachage remplace les clés et les valeurs de l'autre, vous pouvez simplement utiliser un hachage de la tranche pour ajouter un hachage à l'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;
37
répondu brian d foy 2015-02-18 10:48:08

c'est une vieille question, mais sort haut dans ma recherche de Google pour 'Perl merge hashes' - et pourtant il ne mentionne pas le module CPAN très utile Hash:: Merge

13
répondu LeeGee 2014-04-03 13:13:16

pour les références hash. Vous devriez utiliser des accolades comme suit:

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

et pas la réponse ci-dessus à l'aide de parenthèses:

$hash_ref1 = ($hash_ref1, $hash_ref2);
4
répondu JeanieJ 2018-07-07 18:40:27