Ich frage mich, ob es ein idiomatisches One-Liner oder ein Standard-Distributionspaket / -funktion gibt, mit dem ich zwei Perl-Hashes mit nur eingebauten, nicht gesegneten Typen vergleichen kann. Die Hashes sind nicht identisch (sie haben keine äquivalenten Speicheradressen).
Ich würde gerne die Antwort sowohl für flache Hashes als auch für Hashes mit verschachtelten Sammlungen kennen, aber ich verstehe, dass flache Hashes eine viel einfachere Lösung haben können.
TIA!
[Dies war eine Antwort auf eine Antwort von jemandem, der ihre Antwort löschte.]
Oh oh!
%Vor%prüft nicht, ob die Werte zu denselben Schlüsseln gehören.
%Vor% Ich weiß nicht, ob es einen einfachen Weg oder ein eingebautes Paket gibt, und ich weiß nicht, was passiert, wenn du einfach %hash1 == %hash2
machst (aber das ist es wahrscheinlich nicht), aber es ist nicht schrecklich schwer zu rollen deine eigene:
Nicht getestet, sollte aber 0 zurückgeben, wenn die Hashes alle die gleichen Elemente und die gleichen Werte haben. Diese Funktion muss geändert werden, um mehrdimensionale Hashes zu berücksichtigen.
Wenn Sie etwas von einer Standarddistribution möchten, könnten Sie use Data::Dumper;
verwenden und die zwei Hashes einfach in zwei skalare Variablen ausgeben und dann die Strings auf Gleichheit hin vergleichen. Das könnte funktionieren.
Es gibt auch ein Paket auf CPAN namens FreezeThaw
, das so aussieht, als ob es das tut, was Sie wollen.
Beachten Sie, dass Sie zur Verwendung der intelligenten Übereinstimmung (die hier nicht wiederholt wird, weil sie bereits gepostet wurde) use feature;
verwenden müssen und sie nur für Perl 5.10 verfügbar ist. Aber wer benutzt immer noch Perl 5.8.8, oder?
Danke für Ihre Frage.
Ich habe Test :: More :: eq_hash als Ergebnis verwendet.
Hashes können in Arrays umgewandelt werden, wobei jeder Wert seinem Schlüssel folgt (aber Sie werden die Reihenfolge der Schlüssel nicht kennen). Also:
%Vor%Oh, warte, das wird nicht funktionieren, weil es einige Randfälle gibt, wie:
%Vor%Daher ist es am besten, ein Zeichen in der Join () zu verwenden, das Sie nie in einem Schlüssel oder Wert finden werden. Wenn die Werte BLOBs sind, wird das ein großes Problem sein, aber für alles andere könnten Sie das NULL-Zeichen "\ 0" verwenden.
%Vor%Sieht irgendwie hässlich aus, ich weiß, aber es wird ausreichen, um zu prüfen, ob zwei Hashes flach sind, was die meisten Leute suchen.
Sie können eq_deeply in Test::Deep::NoTest . Es gibt nur einen booleschen Wert zurück, den Sie überprüfen können, ohne den zusätzlichen Overhead der Testfunktionen des Hauptmoduls .
Tags und Links perl comparison hash