Hello,
I am trying to write a little script that will compare two hashes with the
same keys but conflicting values. I have found some great examples of how
to compare hashes and locate common keys or missing keys (in the cookbook).
I have also found a great example of how to locate duplicate keys in two
hashes (also in the cookbook) but nothing that helps with this question in
particular. The following example is based on a pair of hashes using
hostname and ip address information.
#!/usr/bin/perl
use strict;
use warnings;
# This hash represents the actual data, in other words what the machines
have acquired for an ip address.
my %actual = (
"host1" => "192.168.119.175",
"host2" => "192.168.123.43",
"host3" => "192.168.45.98",
"host4" => "192.168.98.89",
"host5" => "192.168.67.123",
);
# This hash represents the preferred information, or what I would like to
assign to my hosts.
my %register = (
"host1" => "192.168.119.179",
"host2" => "192.168.21.43",
"host3" => "192.168.45.98",
"host4" => "192.168.8.89",
"host5" => "192.168.67.123",
);
My @common = (); # it seems with this I at least have an array that now
maintains a list of host names that definitely exist in both hashes
Foreach my $host (keys %actual) {
Push (@common, $host) if exists $register{$host);
}
# I also sort of wondered if I could use the values function to compare the
hashes but this just resulted in an array with every element in it.
My @not_common = ();
Foreach my $host (values %actual) {
Push(@not_common, $host) unless $register{$host} == $host; }
Print "@not_common\n";
# but as I am sure you can imagine this doesn't work so well..
# at this point I think I should use references to insert the host name and
compare the hosts but I am not sure how I would do this.
# so what I thought might also work is simply comparing the two hashes like
this
My @match = ();
If ($actual{$host1} == $register{$host1}) {
Print "They match!\n";}
Else {
Print "no match. \n";}
# The print statements are just tests, if it had worked I thought I could
open a filehandle to a flat file and write out the match and conflicts.
So, hopefully that is enough to explain what I am trying to do in spite of
my feeble attempts to solve the question.
Thanks in advance to anyone willing to point out the err my ways,
-a