为什么不'持续'让我退出foreach循环?

时间:2017-04-03 11:29:52

标签: perl counting word-count

我想计算包含单词的句子数。我有2个文件,一个包含句子,另一个包含单词,所以对于每个单词,我会计算包含该单词的句子数。

这是我的代码:

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";

例如,如果我有这两句话:

word1 is in sentence1 word1 

word2 is in sentence2

结果应该是:

word1:1

word2:1

1 个答案:

答案 0 :(得分: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);。前者在个别空间上分裂,后者是在空白上分裂的特殊情况。