编辑:
所以我在你的帮助下让脚本运行得很好,所以非常感谢。
我也试图找出如何保持标准输入选择,但仍能使用命令行“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";
}
答案 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 :(得分: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)
。