my @filters = (
( map { my $re = $_; sub { $_[0] =~ $re } } @accept ),
( map { my $re = $_; sub { $_[0] !~ $re } } @reject ),
);
You could even pre-compile the patterns.
my @filters = (
( map { my $re = qr/$_/; sub { $_[0] =~ $re } } @accept ),
( map { my $re = qr/$_/; sub { $_[0] !~ $re } } @reject ),
);
I suspect that building a single pattern would be faster, though.
my $filter;
if ( @accept || @reject ) {
$filter = join "",
( map "(?=(?s:.*?)$_)", @accept ),
( map "(?!(?s:.*?)$_)", @reject );
$filter = qr/^$filter/;
} else {
$filter = qr/(*FAIL)/;
}
sub filter { map $_->[0], grep { $_->[1] =~ $filter } @_ }
|