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;
}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.