perl检查一行包含列表中的一个单词

时间:2017-04-27 12:48:06

标签: perl

我有一个包含几个单词的文件,让我们以此文件为例:

balloon
space
monkey
fruit

我想检查一个字符串是否包含至少一个这样的单词。我将所有单词存储在数组中,如下所示(文件在参数中指定):

open my $exampleFile, '<', $ARGV[0];
chomp(my @exampleWords= <$exampleFile>);
close $exampleFile;

然后我使用grep检查其中一个单词是否在字符串中:

if ( grep( $string, @exampleWords ) ) 
{
    #do something
}   

如果我以字符串this_is_a_balloon_example为例,找到了单词balloon,那么我应该进入循环。目前,似乎为任何给定的字符串输入循环。

3 个答案:

答案 0 :(得分:6)

grep迭代一个列表。结果可能是相当低效的。

我建议您要做的就是编译正则表达式。

my $regex = join "|", @examplewords; 
$regex    = qr/\b($regex)\b/; 

if ( $string =~ m/$regex/ ) { 
    print "There was a match on $1\n";
}

答案 1 :(得分:5)

您的grep正在检查真实价值,而$string几乎总是“真实地”&#39;。 您需要的是正则表达式,用于测试$string是否匹配$_

if ( grep($string =~ /$_/, @exampleWords ) ) 
{
    #do something
}

答案 2 :(得分:1)

Perl的grep不像command line utility grep那样有效。您只需检查TextView是否为真,这种情况总是如此。如果您想检查$string中是否包含@exampleWords中的任何字词,您需要告诉Perl。

$string

这使用模式匹配。

或者,您也可以使用index,它返回第一次出现的子字符串的位置,在本例中为if ( grep { $string =~ m/$_/} @exampleWords ) { ... } $_

-1

模式匹配更容易阅读,而且就性能而言,它确实没有什么区别。