package Tie::File::AnyData; use strict; use warnings; use Tie::File; sub TIEARRAY { my ($pack,$file,%opts) = @_; if (defined $opts{'code'}){ my $code = $opts{'code'}; delete $opts{'code'}; *Tie::File::get_next_rec = $code; no warnings 'redefine'; *Tie::File::_read_record = sub { my ($self) = @_; my $rec; $rec = Tie::File::get_next_rec ( $self->{'fh'} ); return $rec; } } Tie::File::TIEARRAY("Tie::File",$file,%opts); } 1; #### use Tie::File::AnyData; my $coderef = sub{ ## Code to retrieve one by one the records of a given format }; tie my @data, 'Tie::File::AnyData', $file, code => $coderef; ## Use the tied array #### my $format1 = sub { ## Subroutine that reads records with format 1 } my $format2 = sub { ## Subroutine that reads records with format 2 } tie my @dataf1, 'Tie::File::AnyData', $file_format1, code => $format1; ## Creates get_next_rec and redefines _read_record tie my @dataf2, 'Tie::File::AnyData', $file_format2, code => $format2; ## Re-defines get_next_rec!!