2011-11-09 9 views
2

私は、aがテキストを処理して辞書に単語の頻度を与え、次に辞書を並べ替えるべきperlスクリプトを書いています。テキストは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

小さな単語リストも投稿できますか?あなたはどこでも%辞書を宣言していません... –

答えて

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

関連する問題