package RecordParser::FixedWidth;
# constructor takes the name of the source file
sub new {
my ( $class, $source ) = @_;
####
my $template;
my @fields;
my @column_specs = lookup_specs($source);
for my $column_spec ( @column_specs ) {
my ($field, $offset, $width)
= @$column_spec{qw(field offset width)};
$template .= "\@${offset}A$width";
push @fields, $field;
}
open my $reader, '<', $source;
##
##
my $obj = {
IO => $reader,
template => $template,
fields_ref => \@fields,
};
bless $obj => $class;
}
##
##
sub next {
my ( $self ) = @_;
my ($reader, $template, $fields_ref)
= @$self{qw(IO template fields_ref)};
my @fields = @$fields_ref;
my $record = <$reader>;
return unless defined $record;
##
##
my %value_of;
my @values = unpack($template, $record);
@value_of{@fields} = @values;
##
##
return \%value_of;
}