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

 

 

 

 

 

 

Reply via email to