Wie mache ich einen einfachen Vergleich der Perl-Hash-Äquivalenz?

8

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!

    
cdleary 12.02.2009, 06:01
quelle

8 Antworten

13

Etwas wie cmp_deeply ist in Test :: Deep verfügbar?

    
codelogic 12.02.2009, 06:09
quelle
4

[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%     
2 revsMagilla Gorilla 12.02.2009 13:52
quelle
1

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:

%Vor%

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?

    
Chris Lutz 12.02.2009 06:13
quelle
1

Danke für Ihre Frage.

Ich habe Test :: More :: eq_hash als Ergebnis verwendet.

    
alexeykomarov 10.03.2012 14:51
quelle
0

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.

    
Moses Moore 14.07.2010 20:28
quelle
0

Für flache Hashes:

%Vor%     
Prolix 12.02.2009 21:23
quelle
0

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 .

    
OmarOthman 18.03.2015 10:42
quelle
-1

Konvertieren Sie Hashes in XML-Dateien und vergleichen Sie, und ja, Sie könnten Multilevel verwenden.

%Vor%     
Sohan 27.05.2011 00:10
quelle

Tags und Links