3

我正在努力制作一个 perl 脚本,请注意我对此很陌生..

这是我试图实现的目标:制作一个脚本,该脚本需要一个 .txt 文件并计算文件中的每个单词。并且当它被计数时,如果文件中的前 10 个单词显示每个单词我计数了多少次,那么这些单词会列出一个列表。

好吧,这就是我到目前为止所得到的,我能够让脚本计算单词以及它们出现的次数。现在我需要进入前十名,我真的不知道在哪里以及如何去做。这是一个家庭作业,所以我不希望/期望你为我解决它,只是给我一些关于从哪里开始的指示。

感谢您的帮助(提前)


10 月 15 日更新

好吧,一切都很好,但是..

就像现在一样,它只是在一行中打印所有内容。我需要它这样打印:

4 word
3 next word
2 next word

嗯,你明白了。。


我想我明白了……我想:P


...................................................

#! /usr/bin/perl

use utf8;


print ("Vilken fil?\n");
my $filen = @ARGV ? shift(@ARGV) : <STDIN>;
chomp $filen;

my %freq;

open my $DATA, $filen or die "Hittade inte den filen!";


while(<$DATA>) {

    s/[;:()".,!?]/ /gio;    
    foreach $word(split(' ', lc $_)) {  
    $freq{$word}++;                  
     }
}

@listing = (sort { $freq{$b} <=> $freq{$a} } keys %freq)[0..9];
foreach my $word (@listing )
    { print $freq{$word}." $word\n"; };
4

3 回答 3

3

查看 Perl 排序功能的文档:

http://perldoc.perl.org/functions/sort.html

它有一个表单,可以让您指定一个代码块来定义元素的顺序。您可以使用它来按频率而不是按单词的字母顺序对列表进行排序。

文档包括此示例:

# this sorts the %age hash by value instead of key
# using an in-line function
@eldest = sort { $age{$b} <=> $age{$a} } keys %age;

您应该能够使这种模式适应您自己的问题。

获得前十名列表的最有效方法可能是随时跟踪前十名:每次计算计数时,检查它是否属于前十名,如果是,则将其插入正确的位置,可能会敲掉列表中的底部项目。这样,无论字典有多大,您一次只需要跟踪十个单词的顺序。不过,我不知道您是否需要这种额外的效率。

顺便说一句,我在几次工作面试中都看到过这种问题,所以掌握一下是一件好事。

于 2012-10-14T03:11:10.633 回答
2

基于 Nate 的回答,您可以使用切片提取前 10 个元素:

@eldest = (排序 { $age{$b} <=> $age{$a} } 键 %age)[0..9];

于 2012-10-14T08:20:34.043 回答
-1

哈,当我读完你的问题描述时,我知道这是某种家庭作业!:)

对于下一步,您必须扫描 %count 哈希并确定哪些单词出现次数最多。

最幼稚的方法是扫描列表 10 次;每次,找到计数最高的一个并将其存储在前十名列表中,然后将其从 %count 中删除(或将其设置为 0 也可以)。

如果你想更有野心,你可以实现一个排序函数,对 %count 条目进行排序,然后 10 个最高的将放在一起。

我的 Perl 生锈了,但 Perl 库甚至可能为您提供一些功能。一般来说,绝对值得您花时间浏览一下库参考以熟悉可用的内容。

于 2012-10-14T03:09:54.333 回答