use strict; use warnings; use feature qw{ say }; sub groupsOf (&$@); my %hash = map { $_ => int rand 50 } q{a} .. q{z}; say qq{$_\n-----} for groupsOf { join qq{\n}, map { qq{$_ => $hash{ $_ }} } @_ } 10, sort { $hash{ $a } <=> $hash{ $b } } keys %hash; sub groupsOf (&$@) { my $rcToRun = shift; my $groupsOf = shift; my $rcDoIt; $rcDoIt = sub { $rcToRun->( map shift, 1 .. ( @_ < $groupsOf ? @_ : $groupsOf ) ), @_ ? &$rcDoIt : (); }; &$rcDoIt; }