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

时间:2009-06-04 20:47:32

标签: regex perl compilation

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

3 个答案:

答案 0 :(得分:67)

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

if ($var =~ /foo|bar/) {
    # ...
}

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

my $re = qr/foo|bar/;

if ($var =~ $re) {
    # ...
}

如果你想在多个地方使用正则表达式或将它传递给子程序,这很方便。

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

my $pattern = 'foo|bar';

if ($var =~ /$pattern/o) {
    # ...
}
但是,通常情况下,不这样做会更好。 Perl很聪明,知道变量没有改变,正则表达式不需要重新编译。指定/o可能是过早的微优化。这也是一个潜在的陷阱。如果使用/o更改了变量 ,则会导致perl无论如何都要使用旧的正则表达式。这可能导致难以诊断错误。

答案 1 :(得分:19)

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

my $regex = qr/foo\d/;
$string =~ $regex;

答案 2 :(得分:0)

为澄清起见,您可以使用以下方式预编译正则表达式:

my $re = qr/foo|bar/;  #precompile phase
if ( $string =~ $re ) ...   #for direct use
if ( $string =~ /$re/ ) .... #the same as above but a bit complicated
if ( $string =~ m/something $re other/x ) ...  #for use precompiled as a part of bigger regex
if ( $string =~ s/$re/replacement/ ) ...  #for direct use as replace
if ( $string =~ s/some $re other/replacement/x ) ... #for use precompiled as a part of bigger, and as replace all at once

它以perlre记录,但没有直接的例子。