my @input = ( 'a' .. 'e' ); my $max_subset = 3; my $iter = NestedLoops( [ sub { [0] }, ( sub { [ 0 .. 1+$_ ] } ) x $#input ], sub { return -1 if $max_subset < $_; return 1 if @_ == @input; }, ); my @slots; while( @slots = $iter->() ) { my @subsets = ('') x @input; $subsets[$slots[$_]] .= $input[$_] for 0 .. $#input; print "@subsets\n"; }