I was asked
How do we know that perl is smart enough not to recompile the regexp with every iteration of the inner loop nonetheless?
We can use use re 'debug'; to see the difference.
use re 'debug';
for my $i (1..2) {
for my $re (qw( abc def )) {
$i =~ /$re/;
}
}
ouputs
Compiling REx `abc' <------------
size 3 first at 1
1: EXACT <abc>(3)
3: END(0)
anchored `abc' at 0 (checking anchored isall) minlen 3
Freeing REx: `abc'
Compiling REx `def' <------------
size 3 first at 1
1: EXACT <def>(3)
3: END(0)
anchored `def' at 0 (checking anchored isall) minlen 3
Freeing REx: `def'
Compiling REx `abc' <------------
size 3 first at 1
1: EXACT <abc>(3)
3: END(0)
anchored `abc' at 0 (checking anchored isall) minlen 3
Freeing REx: `abc'
Compiling REx `def' <------------
size 3 first at 1
1: EXACT <def>(3)
3: END(0)
anchored `def' at 0 (checking anchored isall) minlen 3
Freeing REx: `def'
while
use re 'debug';
for my $re (qw( abc def )) {
for my $i (1..2) {
$i =~ /$re/;
}
}
outputs
Compiling REx `abc' <------------
size 3 first at 1
1: EXACT <abc>(3)
3: END(0)
anchored `abc' at 0 (checking anchored isall) minlen 3
Freeing REx: `abc'
Compiling REx `def' <------------
size 3 first at 1
1: EXACT <def>(3)
3: END(0)
anchored `def' at 0 (checking anchored isall) minlen 3
Freeing REx: `def'
If the interpolated variables are still the same as they were the last time the regexp was compiled, the regexp is not recompiled.
Update: We get the same results with /\b$re\b/.
|