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/.
In reply to Re^3: are they all there?
by ikegami
in thread are they all there?
by anadem
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |