seq_1 1 33 gene
seq_1 1 20 exon
seq_1 21 27 exon
seq_1 28 33 exon
seq_2 1 80 gene
seq_2 1 80 exon
seq_3 1 55 gene
seq_3 1 30 exon
seq_3 31 50 exon
####
use Tie::File;
tie my @data, 'Tie::File', "datafile";
print "Rec$_\n$data[$_]\n\n" for (0..$#data);
####
Rec1
seq_1 1 33 gene
seq_1 1 20 part
seq_1 21 27 part
seq_1 28 33 part
Rec2
seq_2 1 80 gene
seq_2 1 80 part
Rec3
seq_3 1 55 gene
seq_3 1 30 part
seq_3 31 50 part
####
sub _read_record {
my $self = shift;
my $rec;
{ local $/ = $self->{recsep};
my $fh = $self->{fh};
$rec = <$fh>;
}
## Rest of the subroutine...
}
####
sub get_next_rec
{
my $self = shift;
local $/ = $self->{recsep};
my $fh = $self->{fh};
$rec = <$fh>;
}
sub _read_record {
my $self = shift;
my $rec = $self->get_next_rec();
## Rest of the subroutine...
}
####
package Tie::File::GFF;
use strict;
use warnings;
use base "Tie::File";
sub get_next_rec
{
## Any way of reading records of a file, for example:
my $self = shift;
my $fh = $self->{fh};
return undef if (eof $fh);
my ($last_seen,$last_pos,$rec);
while (<$fh>){
my @f = split /\t/;
$last_seen = $f[0] if (! defined $last_seen);
if ($f[0] eq $last_seen){
$rec.=$_;
$last_pos = int (tell $fh);
return $rec if (eof $fh);
next;
} else {
seek $fh, $last_pos, 0;
return $rec;
}
}
}
1;
####
use Tie::File::GFF;
tie my @data, 'Tie::File::GFF', "datafile";
print "Rec$_\n$data[$_]\n\n" for (0..$#data);
####
Rec1
seq_1 1 33 gene
seq_1 1 20 part
seq_1 21 27 part
seq_1 28 33 part
Rec2
seq_2 1 80 gene
seq_2 1 80 part
Rec3
seq_3 1 55 gene
seq_3 1 30 part
seq_3 31 50 part
####
sub get_next_rec
{
my $self = shift;
local $/ = $self->{recsep};
my $fh = $self->{fh};
$rec = <$fh>;
}
sub _read_record {
my $self = shift;
$self =~ /^(.+)=/;
my $_caller_pack = $1;
my $rec;
if ($_caller_pack ne __PACKAGE__){
$rec = $self->get_next_rec();
} else
{ local $/ = $self->{recsep};
my $fh = $self->{fh};
$rec = <$fh>;
}
## Rest of the sub
}