use Data::Dumper; my %islanders; while () { chomp; my ($key, $cnt, $fruit) = split / /; $key =~ s/://g; $islanders{$key}{$fruit} += $cnt; } print Dumper(\%islanders); __DATA__ Gilligan: 1 coconut Skipper: 3 coconuts Gilligan: 1 banana Ginger: 2 papayas Professor: 3 coconuts MaryAnn: 2 papayas #### $VAR1 = { 'Ginger' => { 'papayas' => '2' }, 'Gilligan' => { 'banana' => '1', 'coconut' => '1' }, 'Skipper' => { 'coconuts' => '3' }, 'MaryAnn' => { 'papayas' => '2' }, 'Professor' => { 'coconuts' => '3' } };