如何使用正则表达式匹配来查找模式数组中的字符串?

时间:2013-06-05 22:25:16

标签: perl

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

while (<MYFILE>)
{
    chomp;

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

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

编辑:

澄清一下,这是效率极低的代码:

while (<MYFILE>)
{
    chomp;

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

我知道有一些简写方法可以做到这一点。

3 个答案:

答案 0 :(得分:2)

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

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

while (<$fh>) {
    if ($_ =~ /$rx/) {
         # stuff
    }
}

答案 1 :(得分:0)

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

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

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

如果您想匹配@matches条目的文字内容,以便@matches = ("foo+")与行foo+匹配而不是fooo符合上述解决方案,您可以像

那样构建正则表达式
my $rx = join '|', map quotemeta, @matches;

答案 2 :(得分:0)

my @matches = qw( cat zebra apple );

{   local $" = '|';

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

但要小心。阅读文档:

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

:)