我正致力于使perl脚本正常工作,并且要注意我对此很新...
这是我想要实现的:制作一个带有.txt文件的脚本并计算文件中的每个单词。当计算时,如果文件中的前10个单词显示我计算的每个单词的次数,则单词会生成一个列表。
这就是我到目前为止所得到的,我已经能够使脚本计算出来的次数和出现的次数。现在我需要进入前十名,我不知道在哪里以及如何做到这一点。这是一个家庭作业,所以我不希望/期望你为我解决它,只是给我一些指示从哪里开始。
感谢您提前帮助
更新了15 oct
好吧,它正在整理一切,但是......现在它只是在一行中打印所有内容。我需要它像这样打印:
4个字
3下一个字
2下一个字
嗯,你得到它..
我想我已经明白了......我想: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"; };
答案 0 :(得分: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;
您应该能够根据自己的问题调整此模式。
获得前十名的最有效方法可能是跟踪前十名:每次计算一次计数,检查它是否属于前十名,如果是,那么将其插入正确的地方,可能会淘汰列表中的底部项目。这样,您只需要一次跟踪十个单词的顺序,无论字典有多大。不过,我不知道你是否需要这种额外的效率。
顺便说一下,我在几次求职面试中都看到过这样的问题,所以掌握这个问题是件好事。
答案 1 :(得分:2)
在Nate的答案基础上,您可以使用切片提取前10个元素:
@eldest =(排序{$ age {$ b}&lt; =&gt; $ age {$ a}}键%年龄)[0..9];
答案 2 :(得分:-1)
哈,当我读完你的问题描述时,我知道这是某种家庭作业! :)
对于下一步,您必须扫描%count哈希并确定哪些单词的出现次数最多。
最天真的方式是在列表中扫描10次;每次,找到一个具有最高计数的那个并将其存储在前十个列表中,然后将其从%count中删除(或将其设置为0也可以)。
如果你想要更加雄心勃勃,你可以实现一个排序函数,对%count条目进行排序,然后10个最高值将在一起。
我的Perl很生疏,但Perl lib甚至可能为你提供一些排序功能。一般来说,浏览图书馆参考资料绝对值得您花时间熟悉可用的内容。