while(){ chomp; if ( m/^ERROR/ ) { $error = 1; push @errors, $_; } else { next unless $error; $error = 0; if ( m/ORA\-00001/ ) { pop @errors; # ignore values and pop off @errors stack; } else { $errors[-1] .= " $_"; # add error string to line msg } } } print "$_\n" for @errors; __DATA__ ERROR at line 2: ORA-00002: blah2 junk line junk line junk line ERROR at line 1: ORA-00001: unique constraint (TBUSOP_1UQ) violated junk line junk line junk line ERROR at line 3: ORA-00003: blah3