package Tie::Handle::MultiRec; use Carp; sub TIEHANDLE { my $pkg = shift; my $fn = shift; my $irs = shift || "\n"; my $n = shift || 1; my $fh = *main::STDIN; # default $fn and open $fh, "<", $fn or croak "read $fn - $!\n"; bless { readline => sub { local $/ = $irs; my $s; for ( 1 .. $n ) { eof($fh) and return $s; $s .= <$fh>; } $s }, n => sub { @_ and $n = shift; $n }, print => sub { for (@_) { /^N\w*=(\d+)/mi and $n = $1; /^I\w*="(.*?)"/msi and $irs = $1; } }, }, $pkg; } sub READLINE { $_[0]{'readline'}->() } sub N { $_[0]{'n'}->($_[1]) } sub PRINT { my $self = shift; $self->{'print'}->(@_); } #### my $ctl = tie *FH, 'Tie::Handle::MultiRec', $0, "\n", 3; my $n = 1; while () { print "Record $n:\n$_\n\n"; $ctl->N(3+$n); # get more lines per read (the conventional way) print FH qq(irs=""); # switch to paragraph mode (using OOB) $n++; }