2011-11-09 69 views
2

我正在寫一個perl腳本,其中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但您使用的是陣列@words在for循環。

@word=split(/ /); 

應該

@words=split(/ /); 

另一個錯字在byDescendingValues常規:

$value=$dictionaty{$b} <=> $dictionary{$a}; 
       ^^ 

正如在其他答案建議,你真的應該添加

use strict; 
use warnings; 

使用這些你合作很容易發現這些錯別字。沒有他們,你會浪費你很多時間。

+0

但是如何正確地對單詞進行排序? –

+0

@VovaStajilov:我已經更新了答案。 – codaddict

2

以及令人困惑的@word和@words,你也使用$ dictionaty而不是$字典。這是明智的

use strict; 
use warnings; 

在你的程序的啓動和使用my聲明所有的變量。這樣一些微不足道的錯誤就由Perl自己修復了。

+0

嚴格地說,這些錯誤是突出顯示的,而不是固定的 – Zaid

相關問題