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,所以我应该进入循环。目前,似乎为任何给定的字符串输入了循环。

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 ) { 
... 
}

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

最新更新