use strict; use warnings; sub search { my ( $data, $neg, $pos ) = @_; my $regp = join "|", @$pos; # my $regn = join "|", map { s/^-//, $_ } @$neg; # warning: side effects outside of sub search! my $regn = join "|", map { /^-?(.*)/ } @$neg; # no side effects my @results = grep { /$regp/ && !/$regn/ } @$data; return \@results; } my $neg = ["-bo"]; my $results = search(["bobcat", "boomerang", "beer", "bat", "aaa" ], $neg, ["b"]); print "@$results\n"; print "@$neg\n";