1

亲爱的 Stackoverflow 和 Perl 同志们:

我有一个关于 Perl 的小问题:我正在写一个日志阅读器。日志格式是这样的

    2013-05-27T19:01:23 [INFO] item_id:1, state:start at Reader.pm line 23
    2013-05-27T19:01:29 [INFO] item_id:2, state:pause at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:1, state:start at Reader.pm line 23

...

我的目标是计算有多少状态:启动给定的 item_id,例如 item_id:1,显示。在这种情况下,它应该是 2。

到目前为止,我想到的是一个反词:

    sub count {
    my $count_start = 0;

    open (MYFILE, $file_location) or die "Wrong filename";
    while ($file_location = <MYFILE>){
            while ($file_location =~ /\bstart\b/ig){
                    $count_start++;
            }
    }
    close (MYFILE);
    return $count_start;
    }

但我必须计算的不是“start”出现了多少次,而是“start”和“id”出现在同一行中有多少次。我知道我必须添加一些正则表达式,但无法弄清楚任何事情。有任何想法吗?

问候!

4

2 回答 2

2

假设字段的顺序是可预测的:

my %counts;
while (<>) {
    ++$counts{$1} if /item_id:(\S+), state:start/;
}
于 2013-05-27T05:28:47.600 回答
-1

给你一个讨厌的单线:

mogul@guldager:~/tmp$ perl -MData::Dumper  -ne '$h{$1}++ if /(\d+), state:start/;END{print Dumper \%h}'<input-data.txt 
$VAR1 = {
          '1' => 2
        };
于 2013-05-27T05:28:38.397 回答