1

假设我有一个字符串数组,例如@matches = ("cat", "zebra", "apple"),我想打开一个文件并尝试以最简单的方式匹配这些字符串。

while (<MYFILE>)
{
    chomp;

    if (..some match condition...)
    {
        ..stuff..
    }
}

我可以foreach在每一行上使用 a 来尝试匹配,但我知道 Perl 中必须有一种简洁的方式来表示“如果字符串 X 匹配数组 Y 中的任何模式”。我似乎无法在任何地方找到这个。

编辑:

为了澄清,这是效率极低的代码:

while (<MYFILE>)
{
    chomp;

    foreach $m (@matches)
    { 
        if (~ /$m/)
        {
            ..stuff..
        }
    }
}

我知道有一些速记方法可以做到这一点。

4

3 回答 3

2

如何使用join即兴正则表达式?

my @matches = ("cat", "zebra", "apple");
my $rx = join "|", @matches;

while (<$fh>) {
    if ($_ =~ /$rx/) {
         # stuff
    }
}
于 2013-06-05T22:33:31.943 回答
0

您似乎想使用@matchesas 正则表达式的条目。然后,您可以将它们加入更大的正则表达式:

my $rx = join '|', @matches;

while (<>) {
  do stuff if $_ =~ $rx;
}

如果您想匹配 的条目的文字内容@matches,以便@matches = ("foo+")匹配该行foo+而不是fooo上述解决方案所做的那样,您可以像这样构造正则表达式

my $rx = join '|', map quotemeta, @matches;
于 2013-06-05T22:37:50.057 回答
0
my @matches = qw( cat zebra apple );

{   local $" = '|';

    while (<>) {
        chomp;
        if (/@matches/) { ... }
    }
}

但小心点。阅读文档:

perldoc perlvar | grep "\$LIST_SEPARATOR" -A 12

:)

于 2015-10-15T21:04:54.610 回答