2017-04-27 86 views
1

我有一个包含了几句文件的一个字,让我们如本文件: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已被找到,所以我应该进入循环。目前,循环似乎是为给出的任何字符串输入的。

回答

4

grep是检查真正的价值,并$string几乎总是“truthy”。 你需要的是正则表达式,如果$string比赛反对票$_

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

它似乎工作,但有没有办法忽略区分大小写? – Whin3

+0

是的,使用'i'开关,'.. =〜/ $ _/i'。 –

1

Perl的grep并不像command line utility grep工作,在此进行测试。你只是检查是否$string是真的,情况总是如此。如果你想检查@exampleWords中的任何单词是否包含在$string中,你需要告诉Perl。

if (grep { $string =~ m/$_/} @exampleWords) { 
    ... 
} 

这使用模式匹配。

或者,您也可以使用index,它返回子字符串第一次出现的位置,在这种情况下为$_-1

if (grep { index($string, $_) != -1 } @exampleWords) { 
    ... 
} 

模式匹配比较容易,虽然读,而在性能方面它确实没有有所作为。

5

grep迭代列表。结果可能相当低效。

我建议你想要做的是编译正则表达式。

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

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