Regex 字符串的Perl延迟插值

Regex 字符串的Perl延迟插值,regex,string,perl,eval,pcre,Regex,String,Perl,Eval,Pcre,我遇到过这样一种情况:有一个分类脚本,它接收一条消息,将它与一个regex列表进行比较,并将第一个匹配的脚本设置为bucket。一些示例代码如下所示 my $message = 'some message: I am bob'; my @buckets = ( { regex => '^some message:(.*)', bucket => '"remote report: $1"', }, # more pairs );

我遇到过这样一种情况:有一个分类脚本,它接收一条消息,将它与一个regex列表进行比较,并将第一个匹配的脚本设置为bucket。一些示例代码如下所示

my $message = 'some message: I am bob';

my @buckets = (
    {
        regex => '^some message:(.*)',
        bucket => '"remote report: $1"',
    },
    # more pairs
);

foreach my $e (@buckets) {
    if ($message =~ /$e->{regex}/i) {
        print eval "$e->{bucket}";
    }
}

此代码将提供远程报告:我是鲍勃。我一直在关注这一点,觉得必须有一个更好的方法来做到这一点,然后现在就完成。尤其是桶中的双引号“”。有更好的方法来处理这个问题吗?

Perl在计算表达式时解析插值。为此,只需使用一个子例程即可,无需评估:

请注意,您还可以有效地评估正则表达式。您可以在哈希中使用预编译的正则表达式对象,并使用qr//运算符:

...
regex => qr/^some message:(.*)/i,
...
if ($message =~ /$e->{regex}/) {

Perl在计算该表达式时解析插值。为此,只需使用一个子例程即可,无需评估:

请注意,您还可以有效地评估正则表达式。您可以在哈希中使用预编译的正则表达式对象,并使用qr//运算符:

...
regex => qr/^some message:(.*)/i,
...
if ($message =~ /$e->{regex}/) {
可以使用-style格式字符串:

use strict;
use warnings;

my $message = 'some message: I am bob';

my @buckets = (
    {
        regex  => qr/^some message:(.*)/,
        bucket => 'remote report: %s',
    },
    # more pairs
);

foreach my $e (@buckets) {
    if (my @matches = ($message =~ /$e->{regex}/ig)) {
        printf($e->{bucket}, @matches);
    }
}
可以使用-style格式字符串:

use strict;
use warnings;

my $message = 'some message: I am bob';

my @buckets = (
    {
        regex  => qr/^some message:(.*)/,
        bucket => 'remote report: %s',
    },
    # more pairs
);

foreach my $e (@buckets) {
    if (my @matches = ($message =~ /$e->{regex}/ig)) {
        printf($e->{bucket}, @matches);
    }
}

预编译正则表达式给了我什么?@Prgrm.celeritas主要值是qr//提供了正确的引用,如果正则表达式中有反斜杠,这很重要。现在,您首先需要-string引号,这通常很简单,但是字符串的结果将受到另一轮正则表达式转义处理的影响。例如,regex/\w+/必须写为“\\w+”。如果您实际上是从文件中加载这些正则表达式,这并不重要。在正则表达式字符串中仅使用\w+似乎没有问题。虽然添加选项的能力很好,但是哦,你说得对!请注意,您还可以在模式中添加模式修饰符,如?i:foo–就像/foo/i预编译正则表达式会给我什么?@Prgrm.celeritas主要值是qr//提供正确的引用,这与正则表达式中是否有反斜杠有关。现在,您首先需要-string引号,这通常很简单,但是字符串的结果将受到另一轮正则表达式转义处理的影响。例如,regex/\w+/必须写为“\\w+”。如果您实际上是从文件中加载这些正则表达式,这并不重要。在正则表达式字符串中仅使用\w+似乎没有问题。虽然添加选项的能力很好,但是哦,你说得对!请注意,您还可以在模式中添加模式修饰符,如?i:foo–就像/foo/i一样,尽管这需要捕获组在位置上与说明符字符对齐是否正确?@Prgrm.celeritas是,就像$1..$n一样。不过,您实际上可以更改格式字符串中参数的顺序。有关更多信息,请参阅链接文档。尽管这需要捕获组在位置上与说明符字符对齐是否正确?@Prgrm.celeritas是,就像$1..$n一样。不过,您实际上可以更改格式字符串中参数的顺序。有关更多信息,请参阅链接的文档。