2011-11-09 13 views
2

나는 a가 텍스트를 처리하고 사전에 단어 빈도를 제공 한 다음 사전을 정렬해야하는 펄 스크립트를 작성하고 있습니다. 이 텍스트는 Edgar Poe의 "Golden Bug"에서 추출한 것으로 모든 단어의 빈도를 계산하는 데 사용됩니다. 그러나 출력이 없기 때문에 나는 잘못을 저지른다. 언제 내가 잘못하고 있니? 감사.단어 빈도를 카운트 한 다음 정렬하십시오.

open(TEXT, "goldenbug.txt") or die("File not found"); 
while(<TEXT>) 
{ 
chomp; 
$_=lc; 
s/--/ /g; 
s/ +/ /g; 
s/[.,:;?"()]//g; 

@word=split(/ /); 
foreach $word (@words) 
    { 
     if(/(\w+)'\W/) 
     { 
      if($1 eq 'bug') 
      { 
       $word=~s/'//g; 
      } 
     } 
     if(/\W'(\w+)/) 
     { 
      if(($1 ne 'change') and ($1 ne 'em') and ($1 ne 'prentices')) 
      { 
       $word=~s/'//g; 
      } 
     } 

     $dictionary{$word}+=1; 
    } 
} 

foreach $word(sort byDescendingValues keys %dictionary) 
{ 
print "$word, $dictionary{$word}\n"; 
} 

sub byDescendingValues 
{ 
$value=$dictionaty{$b} <=> $dictionary{$a}; 
if ($value==0) 
{ 
return $a cmp $b 
} 
else 
{ 
    return $value; 
} 
} 
+0

작은 단어 목록을 게시 할 수도 있습니까? 또한 당신은 어디에서나 % dictionary를 선언하지 않고 있습니다 ... –

답변

4

당신은 당신의 코드가 있습니다

@word=split(/ /); 
foreach $word (@words) 
    { 

당신은 분할시 @word로 배열 이름 적이 있지만 for 루프에서 배열 @words을 사용하고 있습니다.

@word=split(/ /); 

@words=split(/ /); 

byDescendingValues 일상의 또 다른 오타해야한다 :

다른 대답 제안으로
$value=$dictionaty{$b} <=> $dictionary{$a}; 
       ^^ 

, 당신은 정말 당신이 사용

use strict; 
use warnings; 

을 추가해야합니다 공동 uld는 이러한 오타를 쉽게 발견했습니다. 그들 없이는 많은 시간을 낭비하게 될 것입니다.

+0

어떻게 단어를 적절하게 정렬합니까? –

+0

@VovaStajilov : 답변을 업데이트했습니다. – codaddict

2

@word와 @words를 혼란스럽게하는 것은 물론 $ dictionary 대신 $ dictionaty도 사용하고 있습니다. 이 프로그램의 시작

use strict; 
use warnings; 

에 현명하고 my를 사용하여 모든 변수를 선언합니다. 그런 식으로 사소한 버그는 Perl 자체에서 수정됩니다.

+0

엄밀히 말하면, 버그는 수정되지 않고 강조 표시됩니다. – Zaid

관련 문제