文件中最常用的字符串

时间:2012-10-10 16:18:56

标签: perl file sorting

我发现这里有一个帖子,有人设法从文件中读取信息并整理出最常用的单词并返回每个单词的使用次数。输入来自命令行参数,但我想要执行相同的脚本,然后将文件名作为输入通过脚本运行。我找不到我做错了什么。

print "Type the name of the file: ";
chomp(my $file = <>);

open (FILE, "$file") or die;

while (<FILE>){
    $seen{$_}++ for split /\W+/;
}

my $count = 0;
for (sort {
    $seen{$b} <=> $seen{$a}
              ||
       lc($a) cmp lc($b)
              ||
          $a  cmp  $b
} keys %seen)
{
    next unless /\w/;
    printf "%-20s %5d\n", $seen{$_}, $_;
    last if ++$count > 100;
}
close (FILE);

目前我的结果是:

15                       0
15                       0
10                       0
10                       0
10                       0
5                        1
5                        0
5                        0
5                        0
5                        0

我想要的结果是:

<word>             <number of occurances>
<word>             <number of occurances>
<word>             <number of occurances>
<word>             <number of occurances>
<word>             <number of occurances>
<word>             <number of occurances>

3 个答案:

答案 0 :(得分:2)

该行

printf "%-20s %5d\n", $seen{$_}, $_;

与你的意图相反。 $_是一个字符串,$seen{$_}$_在文本中显示的次数(一个数字)的计数,所以你要说

printf "%-20s %5d\n", $_, $seen{$_};

printf "%5d %-20s\n", $seen{$_}, $_;

答案 1 :(得分:0)

两件事:

  1. 您正在将用户输入的文件输入读入变量$seen而不是$file

  2. 你需要选择你收到的输入来摆脱尾随的newlin:

    my $file= <>;
    chomp($file);
    

    或简短形式:

    chomp(my $file = <>);
    

答案 2 :(得分:0)

在第二行中,您要将文件的名称打开到$ file,而不是$ see。所以:

chomp(my $file = <>);

chomp最后摆脱了换行符(按下回车键)。