in reply to Efficiently parsing a large file

This should do the trick.
my %idx; open FH, "logfile" or die "can't open logfile"; while (<FH>) { my ($ser,$msg) = $_ =~ /^(.+?-.+?)\s+(\S+)/; $idx{$ser}->{$msg}++; if ($idx{$ser}->{begin} && $idx{$ser}->{doing-work} && $idx{$ser}->{complete} ) { # found all the stuff, remove the entry. delete $idx{$ser}; } } print "didn't complete:\n"; foreach my $ser (keys %idx) { print "\t$ser\n"; }