my @data = ( [ 'a', 1 ], [ 'a', 2 ], [ 'b', 3 ], [ 'b', 4 ] ); my %totals; my @order; for (@data) { push @order, $_->[0] unless exists $totals{$_->[0]}; $totals{$_->[0]} += $_->[1]; } for (@order) { # Do something with $totals{$_} }