use strict; use warnings; use Data::Dumper; my %HoA = (); while () { if (/(.+)\s+(\d+)\s*$/) { unshift(@{$HoA{$1}}, $2); } } print Dumper(\%HoA); __DATA__ Barmparas, Galinos, 1120 Barmparas, Galinos, 1410 Beal, Alan, 866 Beall, Dawson, 1062 #### $VAR1 = { 'Beal, Alan,' => [ '866' ], 'Beall, Dawson,' => [ '1062' ], 'Barmparas, Galinos,' => [ '1410', '1120' ] };