my $rec_reader = make_rec_reader('myrecordsep'); while (my $rec = $rec_reader->($fh)) { print("Record\n"); print("======\n"); print "$_\n" for @$rec; print("\n"); } #### sub make_rec_reader { my ($sep) = @_; my $first = 1; my $line; my @rec; return sub { my ($fh) = @_; # Skip what's before first record. if ($first) { $first = 0; for (;;) { $line = <$fh>; last if not defined $line; chomp($line); last if $line eq $sep; } } while (defined($line)) { my @rec; for (;;) { push @rec, $line; $line = <$fh>; last if not defined $line; chomp($line); last if $line eq $sep; } return \@rec; } }; } #### my $sep = 'myrecordsep'; { # Skip what's before first record. for (;;) { $_ = <$fh>; last if not defined; chomp; last if $_ eq $sep; } while (defined($_)) { my @rec; for (;;) { push @rec, $_; $_ = <$fh>; last if not defined; chomp; last if $_ eq $sep; } process_rec(\@rec); } }