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 } ] ); #### %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' ] );