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 }