Ala*_*ore 37
我确信它仍然受到支持,但它已经过时了.如果你想要只编译一次正则表达式,你最好使用正则表达式对象,如下所示:
my $reg = qr/foo$bar/;
Run Code Online (Sandbox Code Playgroud)
插值$bar是在初始化变量时完成的,因此您将始终在封闭范围内使用缓存的,已编译的正则表达式.但有时您希望重新编译正则表达式,因为您希望它使用变量的新值.这是Friedl在The Book中使用的例子:
sub CheckLogfileForToday()
{
my $today = (qw<Sun Mon Tue Wed Thu Fri Sat>)[(localtime)[6]];
my $today_regex = qr/^$today:/i; # compiles once per function call
while (<LOGFILE>) {
if ($_ =~ $today_regex) {
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
在函数范围内,$ today_regex的值保持不变.但是下次调用该函数时,将使用新值重新编译正则表达式$today.如果他刚刚使用过
if ($_ =~ m/^$today:/io)
Run Code Online (Sandbox Code Playgroud)
...正则表达式永远不会更新.因此,使用对象形式,您可以在不牺牲灵活性的情况下获得/ o的效率.
在Perl 5版本20.0文档 http://perldoc.perl.org/perlre.html中 说明
Modifiers
Other Modifiers
…
o - pretend to optimize your code, but actually introduce bugs
Run Code Online (Sandbox Code Playgroud)
这可能是一种幽默的说法,它应该执行某种优化,但实施却被打破了.
因此,最好避免使用该选项.