2012-03-31 8 views
1

Wie kann ich die 100 meistverwendeten Zeichenfolgen (Wörter) in einer .txt Datei mit Perl finden? Bisher habe ich folgendes:100 meist verwendete Zeichenfolgen in Datei

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"; 
} 

Aber das zählt nur jedes Wort und organisiert es in alphabetischer Reihenfolge. Ich möchte die Top 100 am häufigsten verwendeten Wörter in der Datei, sortiert nach Anzahl der Vorkommen. Irgendwelche Ideen?

Verwandte: Count number of times string repeated in files perl

Antwort

8

von den feinen perlfaq4 Lesen (1) manpage, ein how to sort hashes by value lernt. Versuchen Sie es also. Es ist eher idiomatisch "perlian" als Ihr Ansatz.

#!/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; 
} 

Wenn gegen sich selbst führen, die ersten 10 Zeilen der Ausgabe sind:

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

Aus Neugier, die Teil (e) der Antwort erfordert speziell v5.12 Perl? Die 'Warnungen verwenden FATAL =>" utf8 ";' oder die 'use open qw (...)' oder beides? –

+0

@ JonathanLeffler Ich dachte sehr intensiv darüber nach, denn die Antwort ist überhaupt nichts. Ich gebe es einfach ein, weil ich denke, dass jede Perl-Quelleinheit explizit die tatsächliche Version deklarieren sollte, unter der sie lief. Dies liegt daran, wie überraschend flüchtig die subtil wechselnde Syntax und Semantik der Sprache ist, seit sie die zweistelligen Zahlen in den Veröffentlichungsnummern erreichte. Das "offene" Pragma wurde in v5.6 uraufgeführt, allerdings ohne eine Versionsnummer. Ich erinnere mich nicht, wann utf8 Warnungen zum ersten Mal erschienen, noch wann Warnungen auf diese Weise zuerst fatalisierbar waren; Ich bezweifle, dass dies später als V5.8 war. – tchrist

+0

@tchrist: Frage: Beim Ausführen des Programms gegen meine Textdatei bekomme ich den Fehler: 'Verwendung von nicht initialisierten Wert $ _ in Split'. Irgendwelche Ideen warum? – Dynamic