use strict; use warnings; use Data::Dumper; sub make_counter { my ( $tally, @labels ) = @_; return sub { $tally->{$_} += shift for @labels } } my %totals; my $counter = make_counter \%totals, qw(a b c); for(1..10){ $counter->(1,2,3); } print Dumper \%totals;