# assuming a row of data in $_, and row number == $. my @fld_names = qw( begin agency district ssn serv_per_m serv_per_y serv_per_t last_name first_name middle_name cover_group pay_code pay_rate earnings holder ret_pcnt surv_ben work_sch cont_amt cont_code stuff ); my @fld_types = qw( \d \d+ \d+ \d+ \d+ \d+ \d \D+ \D \D \d+ \d+ \d+ \d+\D \s+ \d+ \d+ \d+ \d+\D \d+ .* ); my @fld_vals = ( /(.)(....)(...)(.{9})(..)(..)(.) (.{10})(.)(.)(.{5})(..)(.{8}) (.{7})(.{8})(....)(...)(...)(.{6})(..)(.*)/x ); # now do some testing of values... for my $i ( 0 .. $#fld_names ) { if ( $fld_vals[$i] !~ /^ $fld_types[$i] $/x ) { warn sprintf( "Data row %d: bad value in field %d (%s): %s\n", $., $i, $fld_names[$i], $fld_vals[$i] ); } } my %fields; @fields{@fld_names} = @fld_vals;