为什么`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
答
代码预计@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);
。前者在个别空间分裂,后者是一个特殊情况,在空白处分裂。
'@tab'总是一个元素数组,而'foreach/last'在其上并不合理。 –
从'map {split}中移除'map {split}';' – jm666
您有'use autodie;'两次,而且没有'使用警告;'。 –