use strict; use warnings; search(["bobcat", "boomerang", "beer", "bat"], ["-bo"], ["b"]); sub search { my ($data, $negative_criteria, $positive_criteria )= @_; my $re="^(?!" . join("|", map{ s/^-//;$_ }@$negative_criteria) . ")" . join "|", @$positive_criteria; $re=qr|$re|; my @results = grep { m/$re/ } @$data; for (0..$#results){ print $_+1 . " - $results[$_]\n"; } return \@results; }