По данным perlop
Эффект модификатора 'o' не
распространяться, ограничиваясь тем
шаблоны, явно использующие его.
Так что, если вы напишите
my $str = 'x';
my $re = qr/$str/o;
...
if (s/$re//) {
...
}
Perl по-прежнему будет проверять, изменился ли $re
при выполнении s///
. /o
действует как обещание, что значение $str
, использованное при компиляции $re
, не изменится, поэтому, если вы повторно выполните qr//
, вы получите тот же результат , даже если $str
изменилось. Вы можете увидеть это с use re 'debug'
:
use strict;
use warnings;
use re 'debug';
foreach my $i (0 .. 2) {
my $s = '123';
print STDERR "Setting \$re\n";
my $re = qr/$i/o;
print STDERR "Performing s///\n";
$s =~ s/$re//;
}
С модификатором /o
вы увидите «Compiling REx ...» только после «Setting $ re» в первый раз в цикле. Без этого вы будете видеть это каждую итерацию.
Вывод: если вы хотите изменить шаблон во время выполнения, вам не следует использовать /o
. Это не повлияет на s///
и не позволит вам перекомпилировать $re
, когда вам нужно.