sub apportion { my ($elements, $pieces) = @_; my $small_chunk = int $elements / $pieces; my $oversized_count = $elements % $pieces; ((1 + $small_chunk) x ($oversized_count), ($small_chunk) x ($pieces - $oversized_count)); } sub multi_slice { my ($aref, @chunk_sizes) = @_; my $hi_i = -1; map { my $lo_i = $hi_i + 1; $hi_i += $_; [@$aref[$lo_i..$hi_i]] } @chunk_sizes; } for my $try ([16,3], [17,4], [19,3]) { print "$try->[0] elements into $try->[1] pieces:\n"; print "Sizes: ", join(', ', apportion(@$try)), "\n"; print "@$_\n" for multi_slice([1..$try->[0]], apportion(@$try)); }