my $hdr = <>; <>; my @part1; my @part2; my $part = \@part1; while (<>) { if ($_ eq "----------------\n") { my $next_hdr = pop(@$part); process_rec($hdr, \@part1, \@part2); $hdr = $next_hdr; @part1 = (); @part2 = (); $part = \@part1; } elsif ($_ eq "****************\n") { $part = \@part2; } else { push @$part, $_; } } process_rec($hdr, \@part1, \@part2);