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