Or, you could just count up to the product of the array sizes, and use the count to compute the offsets into the arrays (I think a note described this, but no code). If you have lists of lengths l1,...,lk, think of the numbers 0..(l1*...*lk-1). You want to convert them to a variable-base number system, where the first digit can be 0..l1-1, the second digit can be 0..l2-1,...
#!/usr/local/bin/perl -w
use strict;
my @aoa = (
[('a'..'f')],
[('A'..'C')],
[(1..2)],
);
my $iter = make_permutator(@aoa);
while (my @els = $iter->() ){
print "@els\n";
}
# ariels' code from here
sub make_permutator {
use integer;
my @idx_link = (0, @_);
return sub {
my $idx = $idx_link[0]++;
my @ret;
for my $i (1..$#idx_link) {
push @ret, $idx_link[$i][$idx % @{$idx_link[$i]}];
$idx /= @{$idx_link[$i]};
}
return $idx ? () : @ret;
}
}
|