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; } } }