Подсчитайте частоту слов, а затем отсортируйте их - PullRequest
2 голосов
/ 09 ноября 2011

Я пишу Perl-скрипт, в котором должен обрабатывать текст, а затем предоставлять словарю частоту слов и затем сортировать словарь.Текст является выдержкой из «Золотого жука» Эдгара По, и его цель - подсчитать частоту всех слов.Но я делаю что-то неправильно, потому что я не получаю вывод.Когда я делаю неправильно?Спасибо.

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;
}
}

Ответы [ 2 ]

4 голосов
/ 09 ноября 2011

В вашем коде есть:

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

Вы назвали массив как @word во время разделения, но вы используете массив @words в цикле for.

@word=split(/ /);

должно быть

@words=split(/ /);

Еще одна опечатка в процедуре byDescendingValues:

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

Как предлагается в другом ответе, вам действительно следует добавить

use strict;
use warnings;

Используя их, вы могли легко поймать эти опечатки.Без них вы будете тратить много времени.

2 голосов
/ 09 ноября 2011

Помимо путаницы @word и @words, вы также используете $ dictionaty вместо $ dictionary.В начале вашей программы целесообразно

use strict;
use warnings;

и объявить все переменные, используя my.Таким образом, тривиальные ошибки, подобные этой, исправляются самим Perl.

...