my $tag;
my $rec;
- my $pos = 0;
my $offset = $self->{offset} || 0;
- my $end_pos = 0;
- $end_pos = $offset + $self->{limit} if $self->{limit};
+ my $limit = $self->{limit} || 0;
- warn "# range: $offset - $end_pos";
+ my $file_pos = 0;
+ my $end_pos = 0;
+ $end_pos = $offset + $limit if $limit;
+
+ $self->{_rec} = [];
+
+ warn "# offset: $offset limit: $limit end: $end_pos";
while( $line = <$fh> ) {
chomp($line);
if ( $line eq 'EF' ) {
last;
} elsif ( $line eq 'ER' ) {
- last if $end_pos && $pos >= $end_pos;
- $pos++;
- next if $offset && $pos < $offset;
+ $file_pos++;
+ last if $end_pos && $file_pos > $end_pos;
- # join tags
- foreach ( qw/AB DE ID TI SO RP SC FU FX PA JI/ ) {
- $rec->{$_} = join(' ', @{ $rec->{$_} }) if defined $rec->{$_};
- }
- # split on ;
- foreach ( qw/ID SC DE/ ) {
- $rec->{$_} = [ split(/;\s/, $rec->{$_}) ] if defined $rec->{$_};
+ if ( ! $offset || $file_pos > $offset ) {
+
+ # join tags
+ foreach ( qw/AB DE ID TI SO RP SC FU FX PA JI/ ) {
+ $rec->{$_} = join(' ', @{ $rec->{$_} }) if defined $rec->{$_};
+ }
+ # split on ;
+ foreach ( qw/ID SC DE/ ) {
+ $rec->{$_} = [ split(/;\s/, $rec->{$_}) ] if defined $rec->{$_};
+ }
+ $rec->{'000'} = [ $file_pos ];
+ push @{ $self->{_rec} }, $rec;
}
- $rec->{'000'} = [ $pos ];
- push @{ $self->{_rec} }, $rec;
$rec = {};
$line = <$fh>;
chomp $line;
$log->logdie("expected blank like in ",$arg->{path}, " +$.: $line") unless ( $line eq '' );
- } elsif ( $offset && $pos < $offset ) {
+ } elsif ( $offset && $file_pos < $offset ) {
next;
} elsif ( $line =~ /^(\S\S)\s(.+)$/ ) {
- $tag = $1;
- $v = $2;
+ $tag = $1;
+ $v = $2;
} elsif ( $line =~ /^\s{3}(.+)$/ ) {
- $v = $1;
- if ( $tag eq 'CR' && $v =~ m{DOI$} ) {
- my $doi = <$fh>;
- chomp($doi);
- $doi =~ s{^\s{3}}{ } || die "can't find DOI in: $doi";
- $v .= $doi;
- }
-
+ $v = $1;
+ if ( $tag eq 'CR' && $v =~ m{DOI$} ) {
+ my $doi = <$fh>;
+ chomp($doi);
+ $doi =~ s{^\s{3}}{ } || die "can't find DOI in: $doi";
+ $v .= $doi;
+ }
} elsif ( $line =~ m{^(\S\S)\s*$} ) {
warn "# $arg->{path} +$. empty |$line|\n";
} else {
}
}
-
- $self->{size} = $pos - $offset;
-
$log->debug("loaded ", $self->size, " records");
$self ? return $self : return undef;
my ( $mfn, $filter_coderef ) = @_;
+ $mfn -= $self->{offset} if $self->{offset};
return $self->{_rec}->[$mfn-1];
}
sub size {
my $self = shift;
- return $self->{size};
+ $#{ $self->{_rec} } + 1;
}
=head1 SEE ALSO