2012-03-31 22 views
1

如何使用Perl在.txt文件中找到最常用的100個字符串(單詞)?到目前爲止,我有以下內容:文件中使用最多的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)手冊頁,一個學習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

在對答案的好奇心,該部分(S)特別需要Perl V5.12? '使用警告FATAL =>「utf8」;',或者'使用open qw(...)',或者兩者都使用? – 2012-03-31 15:49:23

+0

@JonathanLeffler我對此非常沉重,因爲答案根本就沒有。我只是因爲我認爲每個Perl源代碼單元都應該明確聲明它運行的實際版本。這是因爲語言的語法和語義有微妙的變化,因爲它在發行版本中達到了兩位數。儘管還沒有版本號,但是v5.6版本的「開放式」編譯指示仍然有效。我不記得什麼時候第一次出現utf8警告,也沒有記得警告首先以這種方式死亡;不過,我懷疑這比v5.8更晚。 – tchrist 2012-03-31 15:55:34

+0

@tchrist:問題:當針對我的文本文件運行程序時,出現錯誤:'在split中使用未初始化的值$ _'。任何想法爲什麼? – Dynamic 2012-03-31 15:57:37

相關問題