2017-04-27 83 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"; 
}