use strict;
use warnings;
my $M = 5;
my @a = 1..$M;
my $N = 3;
get_all_tuples ($N, [], @a);
sub get_all_tuples {
my ($level, $valref, @a) = @_;
if ($level <= 1) {
print "@$valref $_\n" for @a;
} else {
while (@a) {
my $i = shift @a;
push @$valref, $i;
get_all_tuples ($level-1, $valref, @a);
pop @$valref;
}
}
}
####
$ perl N_among_M.pl
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
####
$ perl N_among_M.pl
1 2 3 4
1 2 3 5
1 2 3 6
1 2 3 7
1 2 3 8
1 2 3 9
1 2 3 10
1 2 4 5
...
5 7 9 10
5 8 9 10
6 7 8 9
6 7 8 10
6 7 9 10
6 8 9 10
7 8 9 10
####
$ time perl N_among_M.pl
167960
real 0m0.524s
user 0m0.499s
sys 0m0.015s