88 votes

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';
 

156voto

dreftymac Points 7843
%newHash = (%hash1, %hash2); %hash1 = %newHash;

ou d'autre ...

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

voir aussi ...

38voto

brian d foy Points 71781

Découvrez perlfaq4: Comment fusionner deux hachages. 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 vous décider de fusionner deux tables de hachage, vous devez décider quoi faire si les deux hachages contiennent des clés, qui sont les mêmes, et si vous voulez laisser l'original hachages comme ils étaient.

Si vous souhaitez conserver l'original de la cendre, une copie de hachage (%hash1) à une nouvelle table de hachage (%new_hash), puis ajouter les clés de l'autre de hachage (%hash2 à la nouvelle table de hachage. 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 une nouvelle table de hachage, vous pouvez toujours utiliser cette boucle de la technique; il suffit de changer le %new_hash %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 n'aimez pas que l'un de 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 remplacer les valeurs de %hash1 quand ils ont les clés en commun:

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

14voto

LeeGee Points 833
<p>C’est une question ancienne, mais sort de haute dans ma recherche Google pour « hachages de fusion perl » - et encore, il ne mentionne pas le module CPAN très utile <a href="https://metacpan.org/pod/Hash%3a%3aMerge" rel="nofollow">Hash::Merge</a></p>

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: