2017-04-03 81 views
0

我想計算包含單詞的句子數。我有2個文件,一個包含句子,另一個包含單詞,所以對於每個單詞我都會計算包含這個單詞的句子數。爲什麼`last`不讓我退出foreach循環?

這是我的代碼:

use strict; 
use autodie; 
use autodie; 

open my $fh_resultat, ">:utf8", 'out'; 
use constant CORPUS_MOT => 'test'; 
use constant CORPUS_Phrases => 'phrases'; 
my @tab_MOT_CORPUS = do { 
    open my $fh1, "<:utf8", CORPUS_MOT; 
    map { split } <$fh1>; 

}; 

my @tab_phrase_CORPUS = do { 
    open my $fh2, "<:utf8", CORPUS_Phrases; 
    map { split } <$fh2>; 

}; 

foreach my $mot (@tab_MOT_CORPUS) { 

    my $nb_phrase = 0; 

    foreach my $ph (@tab_phrase_CORPUS) { 

     my @tab = split(/ /, $ph); 

     chomp @tab ; 

     #it should quit foreach if mot == val 
     foreach my $val(@tab) { 

      if ($mot eq $val) { 

      $nb_phrase = $nb_phrase + 1; 
      last; 

      } 

     } 

    } 

    print $fh_resultat "$mot:$nb_phrase\n"; 
} 

print "$nbre_ligne\n"; 

例如,如果我有這2句:

word1 is in sentence1 word1 

word2 is in sentence2 

的結果應該是:

word1:1 

word2:1 
+2

'@tab'總是一個元素數組,而'foreach/last'在其上並不合理。 –

+1

從'map {split}中移除'map {split}'<$fh2>;' – jm666

+0

您有'use autodie;'兩次,而且沒有'使用警告;'。 –

回答

4

代碼預計@tab_phrase_CORPUS遏制線條,但它包含文字。

my @tab_phrase_CORPUS = do { 
    open my $fh2, "<:utf8", CORPUS_Phrases; 
    map { split } <$fh2>; 
}; 

應該

my @tab_phrase_CORPUS = do { 
    open my $fh2, "<:utf8", CORPUS_Phrases; 
    map { chomp; $_ } <$fh2>; 
}; 

提示:刪除chomp @tab;。從文件中讀取換行符時,換行符已被刪除,這是正確的時間。提示:my @tab = split(/ /, $ph);最好寫成my @tab = split(' ', $ph);。前者在個別空間分裂,後者是一個特殊情況,在空白處分裂。