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"; undef } else { return 0 } }