2017-04-03 13 views
0

단어가 들어있는 문장의 수를 계산하고 싶습니다. 나는 2 개의 파일을 가지고 있는데, 하나는 문장을 포함하고 다른 하나는 단어를 포함하므로 각 단어에 대해이 단어를 포함하는 문장의 수를 세어 보겠다. 나는이 두 문장이있는 경우 예를 들어왜 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"; 

가 :

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

'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);으로 작성하는 것이 좋습니다. 전자는 개별 공간에서 분리되며, 후자는 공백으로 분리되는 특수한 경우입니다.