use strict; use warnings; use Data::Dumper; my @subs; $subs[ 8 ] = sub { $_[0]->{'return1'} = substr $_[1], 0, 39 }; $subs[ 9 ] = sub { $_[0]->{'return2'} = substr $_[1], 0, 39 }; $subs[ 10 ] = sub { $_[0]->{'return3'} = substr $_[1], 0, 39 }; $subs[ 11 ] = sub { $_[0]->{'return4'} = substr $_[1], 0, 39 }; my @csv; while(){ chomp; push @csv, {} if 1 == $. % 58; $subs[$. % 58]( $csv[-1], $_ ) if defined $subs[$. % 58]; } print Dumper \@csv; __DATA__ 06 01720168-00000000257980 123 S Somewhere HWY 192 172016-8 Company NATURAL GAS CO., INC. Business P O BOX 1547 123 Road Dr. Town ST 12345 SUITE# 1234 Town, ST 12345