use strict; use warnings; use Data::Dump::Streamer; my $allusers = [ {...} ]; # Data per sample my %users; for my $user (@$allusers) { my $name = $user->{user}; $users{$name}{$_} += $user->{$_} for qw(duration amount); } @$allusers = map { {user => $_, duration => $users{$_}{duration}, amount => $users{$_}{amount}} } sort keys %users; Dump $allusers; #### $ARRAY1 = [ { amount => 600, duration => 6, user => 'Michael' }, { amount => 700, duration => 7, user => 'Sarah' }, { amount => 800, duration => 8, user => 'William' } ];