my $unpack_format = ' @0 A8 xxA9 xxxxxxxxA8 xxxxxxxxxxxa5 LastName, FirstName Home field @53 A19 xxxxxxxxA8 xxxxxxxxxxxa5 Address1 Work field @105A38 xxxxxxxxA5 Address2 field @157A4 xxA5 xxA8 xxxxxxxxA5 xxxxxxxxxA5 City, State, zip field field @261xxxxxxxA5 xxxxxxxxxxxxxxA5 xxxxxxxxxxxxxxxxA5 field field field @313xxxxxxxA5 xxxxxxxxxxxxxxA5 xxxxxxxxxxxxxxxxA5 field field field @365xxxxxxxA5 xxxxxxxxxxxxxxA5 xxxxxxxxxxxxxxxxA5 field field field '; ## remove the "documentation" lines. $unpack_format = s[^\s.*?\n][]mg; my %personnel; # Assuming that the Personnel number is an integral part of the filename for my $filename ( ) { my %record; @record{ qw[ lastname firstname homephone field1 address1 workphone field2 address2 field3 city state zip field4 field5 field6 field7 field8 field9 field10 field10 field11 field12 field13 field14 ] } = unpack $unpack_format, slurp_file( $filename ); # Slurp file could be a function or do{ local (*ARGV, $/) = $filename, <> }; # Search for [Juerd]s "Cheap idioms" node for details $personnel{ $filename =~ m[PID(\d+)\.rec] } = \%record; } #### my $re_record = qr[ #LastName, FirstName Home field ([^,]+) ,([^ ]+) \sHome <([^>]+) >\s+field\s<([^>]+)> \s*\n #Address1 Work field\s (.*) Work <([^>]+) >\s+field\s<([^>]+)> \s*\n #Address2 field (.*) field\s<([^>]+)> \s*\n #City, State, zip field field ([^,]+),([^,]+),(.*) field\s<([^>]+)>\sfield\s<([^>]+)> \s*\n \s* \n #field field field field\s<([^>]+)> \s+field\s<([^>]+)> \s+ field\s<([^>]+)> \s*\n #field field field field\s<([^>]+)> \s+field\s<([^>]+)> \s+ field\s<([^>]+)> \s*\n #field field field field\s<([^>]+)> \s+field\s<([^>]+)> \s+ field\s<([^>]+)> \s*\n ]x; my $record = slurp_file( $filename ); my %record; @record{ qw[ .... ] } = ( $record =~ $re_record ); $personnel{ .... } = \%record;