perl - 如何用 perl 写得更好

标签 perl optimization coding-style hash

给定一个看起来像这样的大输入文件:

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/

相关文章:

Linux:比较大文件

linux - 如何解释 si_status 值

sql - 左联接是我想要的,但是速度很慢?

c++ - 第一个元素之间的差异小于或等于第二个元素的最小值的对数对

C优化中断算法

video - 全出血背景视频?

perl - 如何在脚本中模仿 -l

perl - Perl:从大量数据中删除重复项

android - 在 Android 中将文本设置为 "primary"

PHP:动态访问数组值