use strict; use warnings; use DateTime; my @earliestEvent; open LOGFILE, "<", $filename || die "..."; while (my $input = ) { my ($dateString, $id) = split / - id = /, $input; my $date = DateTime->new( # use one of the constructors to # fill the date ); if (!exists($earliestEvent[$id])) { $earliestEvent[$id] = {}; $earliestEvent[$id]->{"count"} = 1; $earliestEvent[$id]->{"date"} = $date; } else { my $hourBoundary = $earliestEvent[$id]->{"date"}; $hourBoundary->add(hour=>1); if ($date > $hourBoundary) { print OUTFILE "$id\t" . $earliestEvent[$id]->{"date"}->datetime . "\t" . $earliestEvent[$id]->{"count"} . "\n"; $earliestEvent[$id]->{"count"} = 1; $earliestEvent[$id]->{"date"} = $date; } else { ++{$earliestEvent[$id]->{"count"}}; } } } # then, of course, you'll need to print the remaining ones