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!!