あなたの質問は、ハッシュから上位 5 つの値を取得する方法です。あなたはこのコードを持っています:
my @keys = sort {
$words{$b} <=> $words{$a}
or
"\L$a" cmp "\L$b"
} keys %words;
ソートされたハッシュキーがある場所。そこから 5 つのトップ キーを取得しますか?
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 ステートメントに含めて、open が失敗した理由に関する貴重な情報を取得することをお勧めします。
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;
これは 1 行で実行できますmy $key_count = keys %words
。私の意見では、より読みやすい。
$value_count = $words{$key} + $value_count;
演算子で短縮することもできます+=
:$value_cont += $words{$key}
strict と warnings を使用することは非常に良いことです。