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; #### @found = grep { ! exists %members{ lc $_->{ID} } } @found; #### if ( $emp->{ID} =~ /$some_regex/i ) { push @emp_found => $emp; print $emp->{'Name'} . "\n"; } else { push @emp_ot_found => $emp; }