## Filtering tye's "combinations" (power set) iterator:
my $iter = combinations(@S);
while ( my @c = $iter->() ) {
next unless @c == $K;
...
}
####
## Using tye's Algorithm::Loops:
NestedLoops(
[ 0 .. $#S ],
( sub { [$_+1 .. $#S] } ) x ($K - 1),
sub { my @c = @S[@_]; ... }
}
##
##
sub combinations {
my ($num, $arr) = @_;
return sub { return }
if $num == 0 or $num > @$arr;
my @pick;
return sub {
return @$arr[ @pick = ( 0 .. $num - 1 ) ]
unless @pick;
my $i = $#pick;
$i-- until $i < 0 or $pick[$i]++ < @$arr - $num + $i;
return if $i < 0;
@pick[$i .. $#pick] = $pick[$i] .. $#$arr;
return @$arr[@pick];
};
}
##
##
my $iter = combinations( 3 => ['a' .. 'f'] );
while ( my @c = $iter->() ) {
print "@c\n";
}