my $date;
my $lastdate = '';
my $logdata = '';
while ( <LOGFILE> ) {
$date = extract_date( $_ );
$logdata .= $stuff;
if (length $lastdate and $lastdate ne $date) {
print_report( $lastdate, $logdata );
$logdata = '';
}
$lastdate = $date;
}
print_report( $lastdate, $logdata );
That's the rough idea, anyway. Instead of extract_date you may have a parse method that returns a date and whatever else you want from each line. E.g.:
( $date, my $stuff ) = parse( $_ );
$logdata .= $stuff;
# etc.
Also, barring some crazy scheme for the date, the test in the loop could be simplified to
if ( $lastdate and $lastdate ne $date ) {
Another possibility, if you want to keep everything within the loop, is to use eof to test for the end-of-file condition. Then the above would become:
my $date;
my $lastdate = '';
my $logdata = '';
while ( <LOGFILE> ) {
( $date, my $stuff ) = parse( $_ );
$logdata .= $stuff;
if ( $lastdate and ( $lastdate ne $date or eof LOGFILES ) ) {
print_report( $lastdate, $logdata );
$logdata = '';
}
$lastdate = $date;
}
|