有没有办法在Perl中预编译正则表达式?

Sam*_*Lee 29 regex perl compilation

有没有办法在Perl中预编译正则表达式?我有一个在程序中多次使用它并且它在使用之间没有变化.

Mic*_*man 68

对于文字(静态)正则表达式,没有什么可做的 - perl只会编译一次.

if ($var =~ /foo|bar/) {
    # ...
}
Run Code Online (Sandbox Code Playgroud)

对于存储在变量中的正则表达式,您有几个选项.您可以使用qr//运算符来构建正则表达式对象:

my $re = qr/foo|bar/;

if ($var =~ $re) {
    # ...
}
Run Code Online (Sandbox Code Playgroud)

如果要在多个位置使用正则表达式或将其传递给子例程,这很方便.

如果正则表达式模式在字符串中,您可以使用/o选项来保证perl永远不会改变:

my $pattern = 'foo|bar';

if ($var =~ /$pattern/o) {
    # ...
}
Run Code Online (Sandbox Code Playgroud)

不过,通常最好不要这样做.Perl很聪明,知道变量没有改变,正则表达式不需要重新编译.指定/o可能是一个不成熟的微优化.这也是一个潜在的陷阱.如果变量已经改变使用/o将导致perl无论如何都使用旧的正则表达式.这可能导致难以诊断错误.

  • @ephemient嗯,5.10有一个与qr //相关的讨厌的内存泄漏(并且通常编译正则表达式),但是已经修复了.如果你使用5.10,你可以通过说perl -e'qr // while 1'来检查是否有内存泄漏.我知道ActiveState Perl 5.10的OS X版本仍然存在. (9认同)
  • 这些都是真的; 但是,qr //已经支持多年了(它自5.005起就存在了,我认为自5.8以来它一直没有问题) (3认同)
  • 2016年的注释:不推荐使用`/ o`修饰符.有关详细信息,请参阅[此问题](http://stackoverflow.com/q/550258/477563). (3认同)

tse*_*see 19

简单:检查qr //运算符(在Regexp Quote-Like Operators下的perlop中记录).

my $regex = qr/foo\d/;
$string =~ $regex;
Run Code Online (Sandbox Code Playgroud)

  • @akostadinov它仍然是预编译的. (2认同)