相关疑难解决方法(0)

Perl正则表达式的'o'修饰符是否仍然提供任何好处?

过去认为在Perl正则表达式的末尾包含'o'修饰符是有益的.目前的Perl文档似乎甚至没有列出它,当然也不是在perlre修饰符部分.

它现在提供任何好处吗?

仍然接受,因为如果没有别的向后兼容的原因.


正如JA Faucett和brian d foy所指出的那样,如果找到合适的位置(其中一个不是perlre文档),"o"修饰符仍然有记录.它在perlop页面中提到过.它也可以在perlreref页面中找到.

正如Alan M在接受的答案中所指出的,更好的现代技术通常是使用qr //(引用的正则表达式)运算符.

regex perl

38
推荐指数
3
解决办法
1万
查看次数

你如何迫使Perl重新编译一个用"/ o"编译的正则表达式?

技术问题:

鉴于正则表达式:

my $regEx = qr{whatever$myVar}oxi; # Notice /o for "compile-once"
Run Code Online (Sandbox Code Playgroud)

什么是迫使它按需重新编译的最有效方法?(例如,当我从程序逻辑中知道$myVar值已经改变时)没有掉线/o并依赖于Perl的内部智能来自动重新编译?

注意:正则表达式用于替换,这可能会影响重新编译规则sans/o:

$string2 =~ s/$regEx//;
Run Code Online (Sandbox Code Playgroud)

背景是:

  • 我有一个正则表达式,它是通过从配置文件中插入一个相当长(> 1k长)的字符串构建的.

    • 该文件每60分钟重新读取一次.

    • 如果从文件读取的字符串发生更改(通过更改文件时间戳定义),我想使用重新标记的字符串值重新编译正则表达式$myVar.

  • 在mod_perl下运行的Perl模块中重复使用正则表达式.

    • 这意味着(加上字符串长度> 1-2k)我必须使用" /o"修饰符强制在正则表达式上编译一次,以避免Perl的性能损失反复检查变量值是否发生变化(此启发式来自perlop qr//,自正则表达式用作s///上面所示的一部分,而不是作为匹配本身.

    • 这反过来意味着,当我知道变量在1小时内重新润滑后发生变化时,我需要强制正则表达式重新编译,尽管/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 …
Run Code Online (Sandbox Code Playgroud)

regex perl compilation modifier

7
推荐指数
1
解决办法
552
查看次数

标签 统计

perl ×2

regex ×2

compilation ×1

modifier ×1