http://qs1969.pair.com?node_id=693226


in reply to Re: framework for data parsing
in thread framework for data parsing

I concur wholeheartedly. Use objects and encapsulate the gory details.

My earlier post left the details out in the open. Here's how those details fit into pc88mxer's framework.

For each input file format (i.e. parse specification) you need to be able to create an input source object ...
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; }
...whose ->next method will produce the next data record (or undef it there isn't any more.)
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;
The key decision will be what to use for your data record object. A good generic choice is to use a hash-ref.
return \%value_of; }