技术问题:
给定一个正则表达式:
my $regEx = qr{whatever$myVar}oxi; # Notice /o for "compile-once"
强制它按需重新编译的最有效方法是什么?(例如,当我从程序逻辑中知道$myVar
值发生了变化时)没有丢弃/o
并且依赖于 Perl 的内部智能来自动重新编译?
注意:正则表达式用于替换,这可能会影响重新编译规则 sans /o:
$string2 =~ s/$regEx//;
上下文是:
我有一个正则表达式,它是通过从配置文件中插入相当长(> 1k 长)的字符串来构建的。
该文件每 60 分钟重新读取一次。
如果从文件中读取的字符串发生更改(通过更改文件时间戳定义
$myVar
),我想使用.
正则表达式在 mod_perl 下运行的 Perl 模块中被反复频繁地使用。
这意味着(加上字符串长度 > 1-2k)我必须使用 "
/o
" 修饰符在正则表达式上强制编译一次,以避免 Perl 反复检查变量值是否改变的性能损失(这个启发式是从perlop qr//
,因为正则表达式用作如上s///
所示的一部分,而不是单独用作匹配项)。这反过来意味着,当我知道变量在 1 小时内重新 slurping 后发生了变化时,我需要强制正则表达式重新编译,尽管有
/o
修饰符。
更新:这是我需要的说明/o
- 没有它,每次循环迭代都会重新编译(因此必须检查)正则表达式;有了它,它不是:
$ perl -e '{for (my $i=0; $i<3; $i++) {
my $re = qr{$i}oix; $s="123"; $s =~ s/$re//;
print "i=$i; s=$s\n"; }}'
i=0; s=123
i=1; s=123
i=2; s=123
$ perl -e '{ for (my $i=0; $i<3; $i++) {
my $re = qr{$i}ix; $s="123"; $s =~ s/$re//;
print "i=$i; s=$s\n"; }}'
i=0; s=123
i=1; s=23
i=2; s=13