Ваш вопрос заключается в том, как получить пять самых высоких значений из вашего хеша. У вас есть этот код:
my @keys = sort {
$words{$b} <=> $words{$a}
or
"\L$a" cmp "\L$b"
} keys %words;
Где у вас есть отсортированные хеш-ключи. Взять оттуда пять верхних ключей?
my @highest = splice @keys, 0, 5; # also deletes the keys from the array
my @highest = @keys[0..4]; # non-destructive solution
Также некоторые комментарии к вашему коду:
open( my $filehandle0, '<', $file0 ) || die "Could not open $file0\n";
Рекомендуется включить сообщение об ошибке $!
в оператор die, чтобы получить ценную информацию о том, почему не удалось открыть.
for (@words) {
s/[\,|\.|\!|\?|\:|\;|\"]//g;
}
Как я уже сказал в комментарии, вам не нужно экранировать символы или использовать чередование в скобках классов символов. Используйте либо:
s/[,.!?:;"]//g for @words; #or
tr/,.!?:;"//d for @words;
Следующая часть немного странная.
my @stopwords;
while ( my $line = <$filehandle1> ) {
chomp $line;
my @linearray = split( " ", $line );
push( @stopwords, @linearray );
}
for my $w ( my @stopwords ) {
s/\b\Q$w\E\B//ig;
}
Вы читаете стоп-слова из файла... а затем удаляете стоп-слова из $_
? Вы вообще используете $_
в данный момент? Более того, вы повторно объявляете массив @stopwords
в заголовке цикла, что фактически означает, что ваш новый массив будет пустым, и ваш цикл никогда не запустится. Эта ошибка кажется тихой, поэтому вы можете ее никогда не заметить.
my %words = %words_count;
Здесь вы делаете копию %words_count
, что кажется излишним, поскольку вы никогда больше его не используете. Если у вас большой хэш, это может снизить производительность.
my $key_count = 0;
$key_count = keys %words;
Это можно сделать одной строкой: my $key_count = keys %words
. Читабельнее, на мой взгляд.
$value_count = $words{$key} + $value_count;
Также может быть сокращено оператором +=
: $value_cont += $words{$key}
Очень хорошо, что вы используете strict и warnings.
04.12.2012
$_
, поэтомуs/foo//
означает$_ =~ s/foo//
. В вашем цикле я не знаю, на какой$_
вы ссылаетесь. Если это предназначено для применения к$w
, то вы просто удаляете все из массива@stopwords
. 05.12.2012