my $r = {}; # hash to hold the parsed record while () { if (/^(\d+).../) { # found beginning of new record if ($r->{id}) { process($r); } $r = {}; # begin new record $r->{id} = $1; # populate parsed info from this line } elsif (/KEGG.../) { $r->{kegg} = ...; } elsif ... } } if ($r->{id}) { process($r) }; sub process { my $r = shift; ... }