Perl频率排序和其他东西

时间:2011-10-18 08:37:14

标签: perl sorting printing word frequency

编辑:

所以我在你的帮助下让脚本运行得很好,所以非常感谢。

我也试图找出如何保持标准输入选择,但仍能使用命令行“start”,

我希望两者都可以从前开始。 “perl wfreq.pl”然后它询问用户什么文件,但我也希望能够通过说“perl wfreq.pl example.txt”来启动它,然后它不应该要求用户输入。

这可能吗?

#! /usr/bin/perl

use utf8;
use warnings;

print "Please enter the name of the file: \n" ;
$file = <STDIN>;
chop $file;


open(my $DATA, "<:utf8", $file) or die "Oops!!: $!";
binmode STDOUT, ":utf8";

while(<$DATA>) {                          
    tr/A-Za-z//cs;
    s/[;:()".,!?]/ /gio;                   
    foreach $word (split(' ', lc $_)) {  
    $freq{$word}++;                  
     }
}
foreach $word (sort { $freq{$b} <=> $freq{$a} } keys %freq) {           
   @fr = (@fr, $freq{$word});
   @ord = (@ord, $word);        
}
for ($v =0; $v < 10; $v++){
print " $fr[$v] | $ord[$v]\n";
}

3 个答案:

答案 0 :(得分:4)

作为MVS wrote,您需要使用“太空船”<=>运算符,而不是键,而是值。 这是应该有效的例子:

更改

foreach $word (sort keys %freq) {        
    print "$word $freq{$word}\n";        
}

foreach $word (sort { $freq{$a} <=> $freq{$b} } keys %freq) {        
    print "$word $freq{$word}\n";
}

perldoc -f sort在代码段的第23-27行包含相同的示例。

谈论编码:utf8 pragma documentation说将其用于

  

在源代码中启用/禁用UTF-8(或UTF-EBCDIC)

要在文件输入中启用UTF-8,您需要以特定模式打开文件(使用特定图层)并将'utf8'图层应用于STDOUT:

open(my $DATA, "<:utf8", $file) or die "Oops!!: $!";
binmode STDOUT, ":utf8";

有关:utf8和其他IO图层的更多信息,请阅读

  1. :utf8 layer description
  2. perldoc -f open
  3. perldoc -f binmode

答案 1 :(得分:1)

sort keys将按哈希的键排序,这些词就是单词本身。相反,您需要按值排序。请查看documentation以帮助您(特别是有关“太空飞船运营商”<=>的部分)。

要将数字放在单词之前,只需在$word语句中切换$freq{$word}print

至于仅返回前10个结果,请在foreach循环(以及break语句)中尝试计数器。

对于UTF-8字符,您的use utf8应足以启用它们,但如果您遇到问题,this可能会有所帮助。

答案 2 :(得分:0)

你可以在Perl中使用一堆巧妙的东西:

perl -CS -F\\PL+ -alne'$f{lc$_}++for@F}{print"$f{$_} $_"for sort{$f{$b}<=>$f{$a}}keys%f'

有关详细信息,请参阅perlrun(1)