use strict; use warnings; use Data::Dumper; my @players = ( { name => 'name1', deaths => 2, kills => 5, }, { name => 'name2', deaths => 2, kills => 5, }, { name => 'name3', deaths => 2, kills => 5, }, { name => 'name2', deaths => 1, kills => 4, }, ); my %merged; foreach my $player (@players) { if(exists($merged{$player->{name}})) { $merged{$player->{name}}->{deaths} += $player->{deaths}; $merged{$player->{name}}->{kills} += $player->{kills}; } else { $merged{$player->{name}}->{deaths} = $player->{deaths}; $merged{$player->{name}}->{kills} = $player->{kills}; } } print Dumper(\%merged);