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; }