http://qs1969.pair.com?node_id=212557


in reply to Diff on hashes

Hi Hotshot,

A few months ago, I posted Need a test for deep equality. My requirements were rather more exacting than yours, but the discussion is pertinent. As the order of keys in a hash is arbitrary, I discovered a lack of canonical hash ordering in Data::Dumper. This may have been fixed.

In the end, the module that fever pointed out, the obscurely named Class::MakeMethods::Utility::Ref matched my requirement best. I did find an issue with code refs, as I was doing clever stuff with persisting and reconstituting them - I made a small change to the 'Ref' code to deparse coderefs and compare the deparse. However, I digress.

What does your code need to know? Is it just a boolean condition - telling the server to restart, or do you want a breakdown of the differences? To get a list of differences, I would suggest transforming the hashes into canonicalized arrays, and using Array::Compare or Algorithm::Diff.

Warning: untested code

sub canonical_list (%) { my $in = shift; map {$_,$in->{$_}}, sort keys %$in; }