in reply to Re^2: are they all there?
in thread are they all there?

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/.