【问题标题】:Why doesn't `last` let me quit a foreach loop?为什么`last`不让我退出foreach循环?
【发布时间】:2017-04-03 23:02:56
【问题描述】:

我想计算包含一个单词的句子数量。我有 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";

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

word1 is in sentence1 word1 

word2 is in sentence2

结果应该是:

word1:1

word2:1

【问题讨论】:

  • @tab 总是一个元素数组,foreach/last 超过它没有意义。
  • map { split } &lt;$fh2&gt;;中删除map { split }
  • 你有两次use autodie;,而你没有use warnings;

标签: perl counting word-count


【解决方案1】:

代码期望@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);。前者在单个空格上拆分,后者是在空白上拆分的特殊情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多