我有一个包含几个单词的文件,让我们以这个文件为例:
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
,所以我应该进入循环。目前,似乎为任何给定的字符串输入了循环。
grep
迭代列表。因此,它可能相当低效。
我建议你想做的是编译一个正则表达式。
my $regex = join "|", @examplewords;
$regex = qr/b($regex)b/;
if ( $string =~ m/$regex/ ) {
print "There was a match on $1n";
}
你的grep
正在检查真正的值,$string
几乎总是"真实的"。 你需要的是正则表达式,它测试$string
是否匹配$_
,
if ( grep($string =~ /$_/, @exampleWords ) )
{
#do something
}
Perl 的grep
不像命令行实用程序那样工作grep
。你只是在检查$string
是否属实,情况总是如此。如果你想检查@exampleWords
中的任何单词是否包含在$string
中,你需要告诉Perl。
if ( grep { $string =~ m/$_/} @exampleWords ) {
...
}
这使用模式匹配。
或者,您也可以使用index
,它返回子字符串第一次出现的位置,在本例中为$_
或-1
。
if ( grep { index( $string, $_ ) != -1 } @exampleWords ) {
...
}
不过,模式匹配更容易阅读,就性能而言,它确实没有区别。