给定一个看起来像这样的大输入文件:
02/26/2012 08:54:38 Error:java.sql.Exception
02/26/2012 08:54:48 Error:java.sql.Exception
02/26/2012 08:56:05 Error:java.sql.Exception
02/26/2012 08:57:21 Error:java.sql.Exception
02/26/2012 08:59:29 Error:java.sql.Exception
02/26/2012 09:01:14 Error:java.sql.Exception
02/26/2012 09:08:48 Error:java.sql.Exception
02/26/2012 09:10:41 Error:java.sql.Exception
我试图找出每小时的错误数;也就是说,我正在寻找一个看起来像这样的输出文件:
02/26/2012 08 -> 5
02/26/2012 09 -> 3
这是一个对我有用的脚本:
#!/bin/perl
open(MYFILE, 'tata2');
my %table;
while (<MYFILE>) {
chomp;
$dtkey = substr $_, 0, 13;
$table{$dtkey}++;
}
close(MYFILE);
for my $key (keys %table) {
print "$key -> $table{$key}\n";
}
但是考虑到 Perl 的特性,我很确定这可以用更少的代码完成。
如果您能提供一些示例,我将不胜感激。我希望它对那些想要减少为实现某事而编写的代码行的人有用。
最佳答案
你所拥有的已经很短了。您可以通过使用词法文件句柄并检查 open 的返回值来稍微改进一下。
这是使用 Perl 的一些其他语法特性的重写:
open my $fh, '<', 'filename' or die $!;
my %table;
while (<$fh>) {
$table{$1}++ if /([^:]+)/ # regex is a bit shorter than the substr
}
print "$_ -> $table{$_}\n" for keys %table; # statement modifier form
或者,如果你真的想要它很短,那么单衬如何:
perl -lnE '$t{$1}++ if /([^:]+)/; END {say "$_ -> $t{$_}" for keys %t}' infile
关于perl - 如何用 perl 写得更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9536649/