You could construct a HoA keyed by IP with the values being anonymous arrays of concatenated component and eth. Any array with more than one element will show a positive match.
use strict; use warnings; use Data::Dumper; my %components = ( COMP1 => { eth1 => q{10.172.9.21/24}, eth1_gw => q{10.172.1.1}, eth2 => q{10.172.10.21/24}, }, COMP2 => { eth1 => q{10.172.9.22/24}, eth2 => q{10.172.11.21/24}, }, COMP3 => { eth1 => q{10.172.11.21/24}, eth2 => q{10.172.13.21/24}, eth3 => q{10.173.2.98/24}, }, ); my %byIP = (); foreach my $comp ( keys %components ) { foreach my $eth ( keys %{ $components{ $comp } } ) { push @{ $byIP{ $components{ $comp }->{ $eth } } }, qq{$comp:$eth}; } } print Data::Dumper->Dumpxs( [ \ %byIP ], [ qw{ *byIP } ] );
The Data::Dumper output showing that "COMP2 eth2" and "COMP3 eth1" match.
%byIP = ( '10.172.9.22/24' => [ 'COMP2:eth1' ], '10.172.1.1' => [ 'COMP1:eth1_gw' ], '10.172.10.21/24' => [ 'COMP1:eth2' ], '10.172.9.21/24' => [ 'COMP1:eth1' ], '10.172.11.21/24' => [ 'COMP3:eth1', 'COMP2:eth2' ], '10.173.2.98/24' => [ 'COMP3:eth3' ], '10.172.13.21/24' => [ 'COMP3:eth2' ] );
I hope this is useful.
Cheers,
JohnGG
Update: Sorry, I should have read ig's reply properly before posting this. My solutions is essentially identical to his second solution. Please ++ his post, not mine.
In reply to Re: Comparing hash values against other hash values
by johngg
in thread Comparing hash values against other hash values
by carcassonne
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |