Perl:打印出出单词的文件

时间:2016-10-24 13:43:52

标签: perl indexing

我正在尝试编写一个从命令行文件中获取的小程序,并打印出所有文件中出现的单词数以及出现在哪个文件中。第一部分,找到一个单词的出现次数,似乎运作良好。

然而,我正在努力解决第二部分,即找到该单词出现在哪个文件(即文件名)中。我正在考虑使用一个存储单词的数组,但不知道这是最好的方法,还是最好的方法。 这是我到目前为止的代码,似乎适用于计算给定文件中单词出现次数的部分:

use strict;
use warnings;

my %count;

while (<>) {

  my $casefoldstr = lc $_;

  foreach my $str ($casefoldstr =~ /\w+/g) {
    $count{$str}++;
  }
}

foreach my $str (sort keys %count) {
  printf  "$str $count{$str}:\n";
}

2 个答案:

答案 0 :(得分:4)

可以通过$ARGV访问文件名。

您可以使用它来构建嵌套哈希,文件名和单词为键:

use strict;
use warnings;
use List::Util 'sum';

while (<>) {
    $count{$word}{$ARGV}++ for map +lc, /\w+/g;
}

foreach my $word ( keys %count ) {

    my @files = keys %$word;  # All files containing lc $word
    print "Total word count for '$word': ", sum( @{ $count{$word} }{@files} ), "\n";

    for my $file ( @files ) {
        print "$count{$word}{$file} counts of '$word' detected in '$file'\n";
    }
}

答案 1 :(得分:2)

使用数组似乎是合理的,如果你不多次访问任何文件 - 那么你总是可以检查存储在数组中的最后一个值。否则,请使用哈希。

#!/usr/bin/perl
use warnings;
use strict;

my %count;
my %in_file;
while (<>) {
    my $casefoldstr = lc;
    for my $str ($casefoldstr =~ /\w+/g) {
        ++$count{$str};
        push @{ $in_file{$str} }, $ARGV
            unless ref $in_file{$str} && $in_file{$str}[-1] eq $ARGV;
    }
}

foreach my $str (sort keys %count) {
    printf  "$str $count{$str}: @{ $in_file{$str} }\n";
}