OUTER: foreach my $record (@in) { foreach my $field (keys %{$where}) { next OUTER unless $record->{$field} eq $where->{$field}; } push @out, $record; } #### $ time perl -e ' my @out = (); for my $record (0..10000000) { my $keep = 1; foreach my $field (qw /80000/) { unless ($record == $field) { $keep = 0; last; } push @out, $record if $keep; } } print "@out", "\n";' 80000 real 0m4.260s user 0m4.227s sys 0m0.015s #### $ time perl -e ' my @out = (); OUTER: for my $record (0..10000000) { foreach my $field (80000) { next OUTER unless ($record == $field); } push @out, $record ; } print "@out", "\n";' 80000 real 0m2.761s user 0m2.745s sys 0m0.000s #### OUTER: for my $record (0..10000000) { next OUTER unless ($record == 80000); push @out, $record ; } print "@out", "\n";' 80000 real 0m0.854s user 0m0.841s sys 0m0.000s