你的代碼工作正常。我希望你在真實程序中有use strict
和use warnings
?這裏有一個例子,我已經填入@keywords
,其中包括test
。
use strict;
use warnings;
my $sent = "this is a test line";
my @keywords = qw/ a b test d e /;
foreach (@keywords) {
if ($sent =~ /$_/) {
print "match found\n";
}
}
輸出
match found
match found
match found
所以你的數組不包含你所想象的那樣。我敢打賭,你已經從文件或鍵盤上讀取數據,忘記從chomp
的每個單詞末尾刪除換行符。
你可以通過簡單地寫
chomp @keywords
這將刪除換行符從@keywords
所有元素的末尾(如果有的話)。要查看@keywords
真正的內容,你可以將這些行添加到您的程序
use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper \@keywords;
您也將看到的元素a
和e
產生匹配以及test
,我猜你不想要的。你可以前後的$_
值後添加單詞邊界元字符\b
,這樣
foreach (@keywords) {
if ($sent =~ /\b$_\b/) {
print "match found\n";
}
}
但字的正則表達式的定義非常嚴格,只允許字母數字字符或下劃線_
,所以Roger's
,"essay"
,99%
和nicely-formatted
在這個意義上不是「單詞」。根據您的實際數據,您可能需要不同的東西。
最後,我會更緊湊使用for
代替foreach
寫這個循環(它們在各方面相同)和if
的後綴語句修飾形式,這樣
for (@keywords) {
print "match found\n" if $sent =~ /\b$_\b/;
}
當我把'@關鍵字=('測試');'在此之前,運行它,我得到'match found'。 –
顯示如何設置'@關鍵字'。 – Barmar