open(IN, $infile ) || die "can't open logfile: $infile\n"; open(OUT, ">$outfile" ) || die "can't create datfile: $outfile\n"; my ($offset, %sorton); while () { if( m/^(.+?)\((\d+)\)\s-\s\[(.+?)\].+?"(.*?)"\.$/ ) { push @{$sorton{$1}}, [pack("N",$2).$3, $offset]; 1; } $offset = tell(IN); } for my $file ( sort keys %sorton ) { println( bubble($sorton{$file}) ); } sub bubble { my $array = shift; my $start = 0; my $i = $#$array; while(1) { my $new_start; my $new_end = 0; for ( my $j = $start || 1; $j <= $i; $j++ ) { if ( $array->[$j-1][0] gt $array->[$j][0] ) { @$array[$j, $j-1] = @$array[ $j-1, $j]; $new_end = $j-1; $new_start = $j-1 unless defined $new_start; } } last unless defined $new_start; $i = $new_end; $start = $new_start; } return $array; } sub println { my $array = shift; for my $line (@$array) { seek IN, $line->[1], 0; print OUT scalar(); } }