#regex #perl #count #words #word-frequency
#регулярное выражение #perl #подсчитайте #слова #частота слов
Вопрос:
Я пишу скрипт на Perl, в котором a должен обработать текст, а затем предоставить словарю частоты слов, а затем отсортировать словарь. Текст представляет собой выдержку из «Золотого жука» Эдгара По, и цель состоит в том, чтобы вычислить частоты всех слов. Но я делаю что-то неправильно, потому что не получаю выходных данных. Когда я делаю неправильно? Спасибо.
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;
}
}
Комментарии:
1. можете ли вы также опубликовать небольшой список слов? также вы нигде не объявляете %dictionary…
Ответ №1:
В вашем коде есть:
@word=split(/ /);
foreach $word (@words)
{
Вы назвали массив как @word
во время разделения, но вы используете массив @words
в цикле for.
@word=split(/ /);
должно быть
@words=split(/ /);
Еще одна опечатка в byDescendingValues
процедуре:
$value=$dictionaty{$b} <=> $dictionary{$a};
^^
Как было предложено в другом ответе, вам действительно следует добавить
use strict;
use warnings;
Используя их, вы могли бы легко обнаружить эти опечатки. Без них вы будете тратить много своего времени.
Комментарии:
1. но как правильно отсортировать слова?
Ответ №2:
Помимо того, что вы путаете @word и @words, вы также используете $dictionaty вместо $ dictionary. Разумно
use strict;
use warnings;
в начале вашей программы и объявите все ваши переменные с помощью my
. Таким образом, подобные этому тривиальные ошибки исправляются самим Perl.
Комментарии:
1. Строго говоря, ошибки выделены, а не исправлены