10:58:27 chalow$ perl bench.pl <ChangeLog
Benchmark: timing 100 iterations of p1, p2...
p1: 2 wallclock secs ( 1.95 usr + 0.00 sys = 1.95 CPU) @ 51.20/s (n=100)
p2: 77 wallclock secs (76.77 usr + 0.64 sys = 77.41 CPU) @ 1.29/s (n=100)
#! perl -w
# Parse ChangeLog
# Copyright: (C) Project PaoPei with zuihu 2004 JAPAN
# $Id: remoteclog.txt,v 1.2 2004/12/06 08:58:45 zuihu Exp $
package ParseChangeLog;
use strict;
use Parse::RecDescent;
use Data::Dumper;
our $VERSION = '0.1';
my $grammar = q(
file: entry(s)
{
my %file;
for (@{$item[1]})
{
(my $date = $_->[1]->[0]->[0]) =~ s/\-//og;
$file{$date} = $_->[1];
}
\%file;
}
entry: entryheader item(s)
{
my @entry;
push @entry, $item[1], $item[2];
[ $item[1], \@entry ];
}
entryheader: date user
{[$item[1], $item[2]]}
| date
{[$item[1]]}
date: /\d{4}-\d\d-\d\d/ /(\s\(.+?\))?/
{$item[1]}
user: /.+/
{$item[1]}
item: itemheader itembody(s)
{ [$item[1], $item[2]] }
| itemheader
{ [$item[1]] }
itemheader: /^\* / /([^\:]+)/ /:\s*/
{$item[2]}
itembody: /^(?!(\* .+?:|\d{4}-\d\d\-\d\d))(.*)/
{$item[1]}
);
my $text;
{
local $/ = undef;
$text = <STDIN>;
}
my $log = Parse::RecDescent->new($grammar)->file($text);
print Dumper($log);