Wow, I didn't know about File::ReadBackwards! I'll have to try that. Here's what I've been doing to parse an Apache error log at work that's never been rotated. I use a start date and an end date, but I think the same principle should apply to times.
use Tie::File;
tie my @lines, 'Tie::File', 'error.log';
LINE:
for (my $i=$#lines; $i >= 0; $i--) {
my $d = substr($lines[$i], 1, 24);
my $file_date = $time{"yyyy-mm-dd", ParseDate($d)};
next LINE if ($file_date gt $edate);
last LINE if ($file_date lt $sdate);
# process here
}