perl如何使用嵌入变量处理正则表达式?

时间:2013-11-20 02:59:41

标签: regex perl

如果我有一组要在外部配置文件中定义的正则表达式并将它们放入数组中,那么这些正则表达式的编译是如何工作的?是否以某种方式引用它们以便它们不会每次都重新编译?所以基本上,我会有这样的事情:

#/usr/bin/perl
# $regexArray simulates what would be read from the config file.
my $regexArray = [
    [ 'foo', 'bar' ]
  , [ '\bboo\b', 'zoo' ]
 #, ... many more pairs here ...
];

while (<>)
{
  for $regexReplace (@$regexArray)
  {
    s/$regexReplace->[0]/$regexReplace->[1]/g
  }
  print;
}

@$regexArray很长。

那么它会缓存这些正则表达式吗?或者每次编译它们?有没有更好的方法呢?

3 个答案:

答案 0 :(得分:4)

您可以使用qr函数编译正则表达式:

my $regexArray = [
    [ qr/foo/, 'bar' ]
  , [ qr/\bboo\b/, 'zoo' ]
 #, ... many more pairs here ...
];

然后,当您定义它们时,您的正则表达式将只编译一次。实际上,Perl可以优化正则表达式,也许它无论如何都不会重新编译它们。

答案 1 :(得分:2)

对于存储的正则表达式,您可以使用带有正则表达式操作数的qr//运算符,并返回可用于以后匹配的正则表达式对象。正则表达式对象主要用于封装一个正则表达式,可用于编译和获取控制 over 编译正则表达式时。

Regexp Quote-Like Operators的文档主要解释了你所要求的一切。

在下面的示例中,传递给qr//的arg是一个已编译的正则表达式:

use re 'debug';

$re1  = qr/baz/;
$re2  = qr/$re1/;

这里只编译了一个正则表达式..

Compiling REx "baz"
Final program:
   1: EXACT <baz> (3)
   3: END (0)
anchored "baz" at 0 (checking anchored isall) minlen 3 
Freeing REx: "baz"

您可以执行以下操作,以加入您的模式并使用qr//运算符。

my $regexArray = [
    ['foo', 'bar'],
    ['\bboo\b', 'zoo'],
];

my $regex = join '|', map $_->[0], @$regexArray;
my $re    = qr/$regex/;

答案 2 :(得分:-1)

你的for循环不使用它的循环变量和内部引用不存在的东西。如果您想要有意义的答案,请发布实际运行的代码。