<Updated>
I like
nuance's idea (above). I now store undef as the
value when a key is missing from one hash. See nuance's
description
above for an explanation of the "return" values.
</Updated>
Here's some punctuation for you:
(This is a short, concentrated way to do it - only 4 lines)
# Keys 7 and 8 are unique, keys 2,4 and 6 have different values
my %R = (1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7);
my %S = (1=>1, 2=>'b', 3=>3, 4=>'d', 5=>5, 6=>'f', 8=>8);
# 1) Keys in %R which are not in %S
# 2) Keys in %S which are not in %R
# 3) Keys in both which have different values
my %Diffs = ((map(($_ => [$R{$_}, undef]), grep {not exists $S{$_}} k
+eys %R)),
(map(($_ => [undef, $S{$_}]), grep {not exists $R{$_}} k
+eys %S)),
(map(($_ => [$R{$_}, $S{$_}]),
grep {exists $S{$_} and $R{$_} ne $S{$_}} keys %R))
+);
# Print out what we found
for (sort keys %Diffs){
print $_, ': ', join(', ', map(defined $_ ? $_ : 'undef', @{$Diffs{$
+_}})), "\n";
}
A couple points to note:
- if your values are numeric, change the 'ne' in the
third Diffs section
- we use an anonymous array ref to store the values in
%Diffs, so remember to dereference it when you use
%Diffs
Enjoy!
Russ