我正在尝试编写一个从命令行文件中获取的小程序,并打印出所有文件中出现的单词数以及出现在哪个文件中。第一部分,找到一个单词的出现次数,似乎运作良好。
然而,我正在努力解决第二部分,即找到该单词出现在哪个文件(即文件名)中。我正在考虑使用一个存储单词的数组,但不知道这是最好的方法,还是最好的方法。 这是我到目前为止的代码,似乎适用于计算给定文件中单词出现次数的部分:
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";
}
答案 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";
}