use strict; use warnings; my $start = qr/ (\d+\/\d+\/\d+) # date \s+ (\d+:\d+:\d+) # time \s+ user=([^\(]+) # user /x; my $end = qr/^\)\s*#[^#]+#/; #U2 my ( @parsed, @items ); while ( ) { chomp; my $j = /$start/ .. /$end/; next unless $j; @items = /$start/ if $j == 1; push @items, $_ if $j > 1 and $j !~ /E/; if ( $j =~ /E/ ) { #U $j = 0, next unless /#end trans#/; #U push @parsed, [ @items ]; #U } #U } # Print it: foreach my $aref ( @parsed ) { print "$_\n" for @$aref; print "\n"; } __DATA__ 2005/06/06 12:00:00 user=me func( blah blah blah blah blah blah ) #end trans# 2005/06/06 12:01:00 user=other func( blah blah blah blah blah ) #end trans# 2005/06/06 12:01:00 user=yet other func( blah blah blah blah bl... OOOOPS! ) #trans aborted# 2005/06/06 13:01:00 user=yet ANother func( blah blah blah foo bar baz ) #end trans#