use warnings; use strict; my %codeData; my $skipping = 0; my $currCode; while () { if (/^HIT: (\S+)/) { $currCode = $1; $skipping = exists $codeData{$currCode}; next; } next if $skipping; $codeData{$currCode} .= $_; } print $codeData{$_} for keys %codeData; __DATA__ HIT: code2 stuff for code2 HIT: code3 stuff for code3 HIT: code1 stuff for code1 HIT: code90 stuff for code90 HIT: code2 extra stuff for code2 - ignore this HIT: code34 stuff for code34 HIT: code90 and extra stuff for code90 - ignore this #### stuff for code90 stuff for code3 stuff for code2 stuff for code34 stuff for code1