$regex needs to be string compared to the $regex from the previous pass of the loop, so I don't see the gain unless you use a regex instead of a regex pattern.
my @strings = qw(ABC DEF GHI JKL);
my $regex = join '|', map "\Q$_\E", @strings;
$regex = qr/$regex/i;
foreach my $file (@files) {
my $data = slurp $file;
if ($data =~ $regex) {
print " Match\n";
}
}
There may be a gain from not using /i.
my @strings = qw(ABC DEF GHI JKL);
my $regex = lc join '|', map "\Q$_\E", @strings;
$regex = qr/$regex/;
foreach my $file (@files) {
my $data = slurp $file;
if (lc($data) =~ $regex) {
print " Match\n";
}
}
It seems to disable 5.10's trie optimisation, for starters.
$ perl -Mre=debug -e'qr/foo|bar|baz|boo/'
Compiling REx "foo|bar|baz|boo"
Final program:
1: TRIEC-EXACT[bf] (13)
<foo>
<bar>
<baz>
<boo>
13: END (0)
stclass AHOCORASICKC-EXACT[bf] minlen 3
Freeing REx: "foo|bar|baz|boo"
$ perl -Mre=debug -e'qr/foo|bar|baz|boo/i'
Compiling REx "foo|bar|baz|boo"
Final program:
1: BRANCH (4)
2: EXACTF <foo> (13)
4: BRANCH (7)
5: EXACTF <bar> (13)
7: BRANCH (10)
8: EXACTF <baz> (13)
10: BRANCH (FAIL)
11: EXACTF <boo> (13)
13: END (0)
minlen 3
Freeing REx: "foo|bar|baz|boo"
|