for my $key (keys %AoH) { for my $domain qw(ns7.xxx.com wrnadc02.xx.xxxxxx.com) { nsqry($domain, $_ ) for @{$AoH{$key}} ; } } #### my @domain = ( {NAME => 'ns7.xxx.com', IPLIST => []} # IPLIST gets populated dynamically, as discovered , {NAME => 'wrnadc02.xx.xxxxxx.com', IPLIST => []} ); my %IPinfo; # This will be a HoH for (qw (10.220.84.30 10.220.84.51 10.220.84.52 10.220.84.54 ...){ $IPinfo{$_}= {DOMAININDEX => undef, TYPE => "CLIENT"}; } .... OUTER: for my $ip (keys %IPinfo){ for my $domidx (0..$#domain){ my $ptr = nsquery($domain[$domidx]->{NAME}, $ip) ; # Assuming "nsquery" has been modified to return the info next unless $ptr; # No change, if $ptr is empty $IPinfo{$ip}{DOMAININDEX} = $domidx; # Forward ref from IP to DOMAIN $IPinfo{$ip}{PTR} = $ptr; push @{$domain[$domidx]->{IPLIST}}, $ip; # Keep a list of IP's that live in this domain next OUTER; # we bail after the first domain found (More efficient) } }