为什么`last`不让我退出foreach循环?

问题描述:

我想计算包含单词的句子数。我有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}';' – jm666

+0

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

代码预计@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);。前者在个别空间分裂,后者是一个特殊情况,在空白处分裂。