我有一个包含几个单词的文件,让我们以此文件为例:
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
,那么我应该进入循环。目前,似乎为任何给定的字符串输入循环。
答案 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
模式匹配更容易阅读,而且就性能而言,它确实没有什么区别。