Perl:打印出单词出现的文件

Perl:打印出单词出现的文件,perl,indexing,Perl,Indexing,我正试图编写一个小程序,从命令行文件中提取一个单词的出现次数,并从所有文件中打印出该单词出现在哪个文件中。第一部分,查找一个单词的出现次数,似乎很有效 但是,我正在努力解决第二部分,即查找单词出现在哪个文件(即文件名)中。我正在考虑使用一个数组来存储单词,但不知道这是不是最好的方法,或者什么是最好的方法。 这是我到目前为止所拥有的代码,对于计算给定文件中一个单词出现的次数的部分,它似乎工作得很好: 使用严格; 使用警告; 我的%计数; 而(){ 我的$casefoldstr=lc$; forea

我正试图编写一个小程序,从命令行文件中提取一个单词的出现次数,并从所有文件中打印出该单词出现在哪个文件中。第一部分,查找一个单词的出现次数,似乎很有效

但是,我正在努力解决第二部分,即查找单词出现在哪个文件(即文件名)中。我正在考虑使用一个数组来存储单词,但不知道这是不是最好的方法,或者什么是最好的方法。 这是我到目前为止所拥有的代码,对于计算给定文件中一个单词出现的次数的部分,它似乎工作得很好:

使用严格;
使用警告;
我的%计数;
而(){
我的$casefoldstr=lc$;
foreach my$str($casefoldstr=~/\w+/g){
$count{$str}++;
}
}
foreach my$str(排序键%count){
printf“$str$count{$str}:\n”;
}

可以通过访问文件名

您可以使用此选项构建以文件名和单词为键的嵌套哈希:

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";
    }
}
使用严格;
使用警告;
使用列表::Util'sum';
而(){
$count{$word}{$ARGV}++map+lc,/\w+/g;
}
foreach my$word(关键字百分比计数){
my@files=keys%$word;#所有包含lc$word的文件
打印“$word”的总字数:”,sum(@{$count{$word}}{@files}),“\n”;
对于我的$file(@files){
打印“$count{$word}{$file}在“$file”中检测到的“$word”计数\n”;
}
}

可以通过访问文件名

您可以使用此选项构建以文件名和单词为键的嵌套哈希:

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";
    }
}
使用严格;
使用警告;
使用列表::Util'sum';
而(){
$count{$word}{$ARGV}++map+lc,/\w+/g;
}
foreach my$word(关键字百分比计数){
my@files=keys%$word;#所有包含lc$word的文件
打印“$word”的总字数:”,sum(@{$count{$word}}{@files}),“\n”;
对于我的$file(@files){
打印“$count{$word}{$file}在“$file”中检测到的“$word”计数\n”;
}
}

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

#!/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";
}
#/usr/bin/perl
使用警告;
严格使用;
我的%计数;
我的%in_文件;
而(){
我的$casefoldstr=信用证;
对于我的$str($casefoldstr=~/\w+/g){
++$count{$str};
push@{$in_文件{$str}},$ARGV
除非{$str}文件中的ref$和{$str}[-1]eq$ARGV;
}
}
foreach my$str(排序键%count){
printf“$str$count{$str}:@{$in_文件{$str}}\n”;
}

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

#!/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";
}
#/usr/bin/perl
使用警告;
严格使用;
我的%计数;
我的%in_文件;
而(){
我的$casefoldstr=信用证;
对于我的$str($casefoldstr=~/\w+/g){
++$count{$str};
push@{$in_文件{$str}},$ARGV
除非{$str}文件中的ref$和{$str}[-1]eq$ARGV;
}
}
foreach my$str(排序键%count){
printf“$str$count{$str}:@{$in_文件{$str}}\n”;
}

我已经修复了代码上的缩进。我经常惊讶于有多少人试图用看似随机的缩进来编写代码<代码>perltidy-pbpftw!如果你展示了你想要的输出类型,这会有很大帮助。我已经修复了你代码的缩进。我经常惊讶于有多少人试图用看似随机的缩进来编写代码<代码>perltidy-pbpftw!如果您显示所需的输出类型,这会有很大帮助。如果同一文件提供两次,输出应该是什么?@reinierpost如果同一文件提供两次,则该文件的字数将加倍。在到达
while
循环之前,可以通过预处理
@ARGV
来缓解该特定(和令人惊讶的?)场景:
使用列表::Util qw(sum uniq);开始{@ARGV=uniq@ARGV}
或通过打印并清除散列。如果提供两次相同的文件,输出应该是什么?@reinierpost如果提供两次相同的文件,该文件的字数将加倍。在到达
while
循环之前,可以通过预处理
@ARGV
来缓解该特定(和令人惊讶的?)场景:
使用列表::Util qw(sum uniq);开始{@ARGV=uniq@ARGV}
或通过打印并清除上的散列来开始。