【发布时间】:2014-09-26 00:00:44
【问题描述】:
所以我正在尝试编写一个 Perl 脚本,它将接受 3 个参数。
- 第一个参数是输入文件或目录。
- 如果是文件,会统计所有单词的出现次数
- 如果是目录,它会递归遍历每个目录,并获取这些目录中文件中所有单词的所有出现次数
- 第二个参数是一个数字,它将显示出现次数最多的单词的数量。
- 这将仅将每个单词的数字打印到控制台
- 将它们打印到一个输出文件,该文件是命令行中的第三个参数。
它似乎正在递归搜索目录并查找文件中所有出现的单词并将它们打印到控制台。
如何将这些打印到输出文件,以及如何获取第二个参数,即数字,例如 5,并让它在控制台打印出现次数最多的单词数,而将单词打印到输出文件?
以下是我目前所拥有的:
#!/usr/bin/perl -w
use strict;
search(shift);
my $input = $ARGV[0];
my $output = $ARGV[1];
my %count;
my $file = shift or die "ERROR: $0 FILE\n";
open my $filename, '<', $file or die "ERROR: Could not open file!";
if ( -f $filename ) {
print("This is a file!\n");
while ( my $line = <$filename> ) {
chomp $line;
foreach my $str ( $line =~ /\w+/g ) {
$count{$str}++;
}
}
foreach my $str ( sort keys %count ) {
printf "%-20s %s\n", $str, $count{$str};
}
}
close($filename);
if ( -d $input ) {
sub search {
my $path = shift;
my @dirs = glob("$path/*");
foreach my $filename (@dirs) {
if ( -f $filename ) {
open( FILE, $filename ) or die "ERROR: Can't open file";
while ( my $line = <FILE> ) {
chomp $line;
foreach my $str ( $line =~ /\w+/g ) {
$count{$str}++;
}
}
foreach my $str ( sort keys %count ) {
printf "%-20s %s\n", $str, $count{$str};
}
}
# Recursive search
elsif ( -d $filename ) {
search($filename);
}
}
}
}
【问题讨论】:
-
叹了口气,她回答了几个不错的问题,但这可能是重复的:stackoverflow.com/q/12823971/2019415(可能还有其他人)。但是,该副本没有可接受的答案,因此,如果此处的 OP 选择出现在下面的答案之一.... :-)
-
侧边栏:在 perl6 中“打高尔夫球”的单线器(来自 Carl Masak++)!
perl6-m -e '.say for (bag slurp.words).pairs.sort(*.value).reverse[^10]'然后提供一个文件或它们的列表find . -type f -name "*.txt" -
perl5 中的 Oneliner 供后代使用:
perl -lnE '@ar = split/\s+/; $w{$_}++ for @ar}{ say "$_ $w{$_}" for (sort { $w{$b} <=> $w{$a} } keys %w)[0..10]'... 解决方案的修改版本由 @go|dfish in#perl-help提供 -
如果您想要 Unicode 输入和输出,您可能需要使用
perl -C26 -lnE运行上面的 oneliner。请参阅perlunicode了解更多信息。 -
我想通了,谢谢。我会在一分钟内发布我的代码。
标签: regex perl perlscript