foreach $line (@lines) { ($time, $id, $open) = parse($line); next until $code eq 'open'; $open = $time; until ($code eq 'hold') { $line = shift(@lines); ($time, $id, $code) = parse($line); $total += $time-$open; } #### while (@lines) { $line = shift(@lines); ($time, $id, $code) = parse($line); $hash{$id}{want} ||= 'open'; next unless ($hash{$id}{want} eq $code); if ($code eq 'open') { $hash{$id}{open} = $time; $hash{$id}{want} = 'hold'; } else { $hash{$id}{total} += $time - $hash{$id}{open}; $hash{$id}{want} = 'open'; delete $hash{$id}{open}; } }