use warnings; use Data::Dumper; my %hash_of_hashes; while () { %h=(); (my $rn, @h{ qw(lastname firstname DOB funding URNo Photo_permission) }) = (split /,/)[0,1,2,7,18,15,14]; $hash_of_hashes{$rn} = \%h; } foreach (keys %hash_of_hashes) { print $hash_of_hashes{$_},$/; } print "DATA DUMPER SAYS:\n", Dumper \%hash_of_hashes; __DATA__ a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p aa,bb,cc,dd,ee,ff,gg,hh,ii,jj,kk,ll,mm,nn,oo,pp aaa,abb,acc,add,aee,aff,agg,ahh,aii,ajj,akk,all,amm,ann,aoo,app