# Untested, but should work use 5.6.0; use strict; use warnings; package FieldStorage; use Exporter; our @ISA = qw(Exporter); # Using @EXPORT instead of @EXPORT_OK because we want these definitely # in the caller's namespace. If we don't, use @EXPORT_OK. our @EXPORT = qw( getFieldNames isRequired ); my %Fields = ( FOO => { Order => 0, Required => 1, }, BAR => { Order => 1, Required => 0, }, .... ); sub getFieldNames { return sort { $a->{Order} <=> $b->{Order} } keys %Fields; } sub getFieldIndices { return map { $Fields{$_}{Order} } @_ || getFieldNames; } sub isRequired { my $field = shift; return undef unless exists $Fields{$field}; return $Fields{$field}{Required}; } 1; __END__ #### use FieldStorage; # Some stuff here my @fieldNames = grep { isRequired($_) } getFieldNames; my @fieldIndices = getFieldIndices(@fieldNames); my %records; @records{@fieldNames} = (split(/\t/, $_))[@fieldIndices];