2012-03-31 3 views
1

.txtファイルで、Perlを使用して最もよく使われる文字列(単語)の上位100個を見つけるにはどうすればよいですか?これまでのところ、私は以下を持っています:ファイル内で最も使用されている文字列

use 5.012; 
use warnings; 

open(my $file, "<", "file.txt"); 

my %word_count; 
while (my $line = <$file>) { 
    foreach my $word (split ' ', $line) { 
    $word_count{$word}++; 
    } 
} 

for my $word (sort keys %word_count) { 
    print "'$word': $word_count{$word}\n"; 
} 

しかし、これは各単語をカウントし、アルファベット順に整理します。私は、出現回数でソートされた、ファイル中で最も頻繁に使用される単語の上位100を求めます。何か案は?

関連:Count number of times string repeated in files perl

答えて

8

細かいperlfaq4(1)のmanページを読んでから、1はhow to sort hashes by valueを学習します。だからこれを試してください。あなたのアプローチよりもむしろもっとイディオム的に「パーリアン」です。自分自身に対して実行すると

#!/usr/bin/env perl  
use v5.12; 
use strict; 
use warnings; 
use warnings FATAL => "utf8"; 
use open qw(:utf8 :std); 

my %seen; 
while (<>) { 
    $seen{$_}++ for split /\W+/; # or just split; 
} 

my $count = 0; 
for (sort { 
     $seen{$b} <=> $seen{$a} 
        || 
      lc($a) cmp lc($b) # XXX: should be v5.16's fc() instead 
        || 
       $a cmp $b 
    } keys %seen) 
{ 
    next unless /\w/; 
    printf "%-20s %5d\n", $_, $seen{$_}; 
    last if ++$count > 100; 
} 

、出力の最初の10行は、次のとおりです。好奇心のうち

seen      6 
use      5 
_      3 
a      3 
b      3 
cmp      2 
count     2 
for      2 
lc      2 
my      2 
+0

、特にPerlのv5.12を必要とする答えの一部(複数可)? 'FATAL =>" utf8 ";'、 'open qw(...)'、あるいはその両方を使用しますか? –

+0

@JonathanLeffler私は非常に重く考えていました。答えは何もないからです。すべてのPerlソースユニットが実際に実行されたバージョンを明示的に宣言しなければならないと思っているからです。これは、リリース番号の2桁の数字に当たって以来、驚くほど揺らぐ言語の微妙なシフト構文とセマンティクスがあったためです。 'open'プラグマはまだバージョン番号がなくてもv5.6でプレリリースされています。私はutf8の警告が最初に出現したとき、あるいは警告がこのようなやり方で最初に致死的であったときを思い出しません。私はこれがv5.8よりも遅かったとは思わない。 – tchrist

+0

@tchrist:質問:テキストファイルに対してプログラムを実行しているときに、エラーが発生しました。「初期化されていない値$ _を分割で使用する」。理由の任意のアイデア? – Dynamic

関連する問題