<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
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.