Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

Answer: How do I test the deep equality of two hash tables?

by Roy Johnson (Monsignor)
on Nov 03, 2003 at 21:29 UTC ( #304250=categorized answer: print w/replies, xml ) Need Help??

Q&A > hashes > How do I test the deep equality of two hash tables? - Answer contributed by Roy Johnson

This does all the straightforward tests, and warns and returns undef on stuff it can't reliably compare (like code refs). Would probably be better to use UNIVERSAL::isa rather than ref.
sub deep_eq { my ($a, $b) = @_; if (not defined $a) { return not defined $b } elsif (not defined $b) { return 0 } elsif (not ref $a) { $a eq $b } elsif ($a eq $b) { return 1 } elsif (ref $a ne ref $b) { return 0 } elsif (ref $a eq 'SCALAR') { $$a eq $$b } elsif (ref $a eq 'ARRAY') { if (@$a == @$b) { for (0..$#$a) { my $rval; return $rval unless ($rval = deep_eq($a->[$_], $b->[$_ +])); } return 1; } else { return 0 } } elsif (ref $a eq 'HASH') { if (keys %$a == keys %$b) { for (keys %$a) { my $rval; return $rval unless ($rval = deep_eq($a->{$_}, $b->{$_ +})); } return 1; } else { return 0 } } elsif (ref $a eq ref $b) { warn 'Cannot test '.(ref $a)."\n"; un +def } else { return 0 } }

Log In?

What's my password?
Create A New User
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (5)
As of 2019-12-06 06:14 GMT
Find Nodes?
    Voting Booth?
    Strict and warnings: which comes first?

    Results (154 votes). Check out past polls.