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

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

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 }
}

Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://304250]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (5)
As of 2023-03-23 15:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Which type of climate do you prefer to live in?

Results (60 votes). Check out past polls.

Notices?