I've recently done something similar in an environment where I can't use modules for various reasons, some of them even valid. Basically, you delete entries that are common to both hashes from both hashes. The hash with old entries will end up with the entries to delete, the one with new entries with the entries to add. A modification of an entry will become a delete/create.
use strict;
use Data::Dumper;
my %oldhash=( '1.1.1.1' => 'nfs,1',
'4.4.4.4' => 'cifs,0',
'10.0.4.2' => 'afp,1',
'3.3.3.3' => 'nfs,0',
'5.5.5.5' => 'afp,0',
);
my %newhash=( '1.1.1.1' => 'nfs,1',
'7.7.7.7' => 'cifs,0',
'10.0.4.2' => 'afp,2',
'3.3.3.3' => 'nfs,0',
'5.5.5.5' => 'afp,0',
'6.6.6.6' => 'cifs,1',
);
foreach my $ip (keys %newhash) {
if (exists($oldhash{$ip}) &&
$newhash{$ip} eq $oldhash{$ip}) {
delete $oldhash{$ip};
delete $newhash{$ip};
}
}
print "Entries to remove:\n";
print Dumper(\%oldhash);
print "Entries to add:\n";
print Dumper(\%newhash);
Note that your current data structure is limited: if you have an IP that serves multiple protocols, you'll need to step up to a HoA or a HoH (and my code above will break).
CU
Robartes-
-
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.