Comment dois-je faire un simple Perl hachage équivalence de comparaison?
Je me demandais si il y a un idiomatiques one-liner ou un package de distribution/de fonction que je peux utiliser pour comparer deux Perl hachages avec seulement builtin, non-béni types. Les valeurs de hachage ne sont pas identiques (ils n'ont pas l'équivalent des adresses de mémoire).
Je voudrais savoir la réponse pour les deux pour les hachages et les tables de hachage avec les collections imbriquées, mais je comprends que peu profonde hachages peut avoir une solution beaucoup plus simple.
TIA!
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme cmp_deeply disponible dans Test::Deep ?
[Ceci est une réponse à une réponse de quelqu'un qui a supprimé leur réponse.]
Uh oh!
ne vérifie pas si les valeurs appartiennent à la même touches.
~~
de l'opérateur. 🙂Je ne sais pas si il existe un moyen simple ou intégré dans le paquet, et je ne sais pas ce qui se passe quand vous venez de le faire
%hash1 == %hash2
(mais ce n'est probablement pas), mais il n'est pas très difficile de rouler vos propres:Pas testé, mais doit retourner 0 si les valeurs de hachage ont tous les mêmes éléments et les mêmes valeurs. Cette fonction devra être modifiée pour tenir compte de multidimensionnelles hachages.
Si vous voulez quelque chose d'une distribution standard, vous pourriez
use Data::Dumper;
et viens de vider les deux hachages en deux variables scalaires, puis de comparer les chaînes de caractères pour l'égalité. Qui pourrait fonctionner.Il y a aussi un paquet sur le CPAN appelé
FreezeThaw
qui dirait qu'il fait ce que vous voulez.Noter que l'utilisation de la smart match (pas répétées ici parce que c'est déjà posté), vous aurez à
use feature;
et il est disponible uniquement pour Perl 5.10. Mais qui utilise encore Perl 5.8.8, droit?Merci pour votre question.
J'ai utilisé de Test: Plus d'::eq_hash comme résultat.
hachages peut être coulé dans des tableaux, où chaque valeur suit sa clé (mais vous ne saurez pas à l'ordre des clés). Donc:
Oh, attendez, ça ne marchera pas car il y a des cas limites, comme:
Il est donc préférable d'utiliser un personnage dans le join() que vous SAVEZ ne sera jamais apparaître dans n'importe quelle clé ou une valeur. Si les valeurs sont les Gouttes, qui sera un gros problème, mais pour quoi que ce soit d'autre, vous pouvez utiliser la valeur NULL char "\0".
Ressemble un peu laid, je sais, mais il va faire pour vérifier si deux hachages sont égaux dans une manière superficielle, qui est ce que la plupart des gens sont à la recherche pour.
Pour les hachages:
Vous pouvez utiliser eq_deeply dans Test::Deep::NoTest. Elle retourne une valeur booléenne que vous pouvez vérifier, sans la surcharge des capacités d'analyse de la module principal.
convertir les hachages de fichiers xml et de les comparer, et oui vous pouvez utiliser plusieurs niveaux.