use strict; use Data::Dumper; my @found = map { {ID=>$_} } qw( abC e8q xxx 11m ); my $matched = 0; my %manager = ( 1 => { bob => { members => [qw{ abc def gdF }] } }, 7 => { alice => { members => [qw{ 5hg 8DF 9iw }] }, charlie => { members => [qw{ 2je e8q 11M }] } } ); foreach my $id (keys %manager){ foreach my $manager (keys %{$manager{$id}}){ for my $i (0..$#{$manager{$id}{$manager}{'members'}}){ my $index=0; foreach my $emp (@found){ if ($emp->{'ID'}=~/$manager{$id}{$manager}{'members'}[$i]/i){ splice(@found, $index, 1); print $emp->{'Name'} . "\n"; $matched++;} $index++;}}}} print "Matched: ($matched) ", Dumper \@found;