for $i (0..1) { for $j ($i+1..3) { for $k ($j+1..5) { for $l ($k+1..7) { #### my $depth = 4; my $loop = [[0..1]]; my $val = 3; for my $i (1..$depth-1) { push @$loop, sub {[$_+1..$val]}; $val+=2; } my $iter = NestedLoops($loop); while (my @list = $iter->()) { output(@list); } sub output { my @args = @_; print join '', @args, "\n"; } #### my $n = shift; sub plustwo_iter { my $val = 1; return sub { $val +=2; return $val; } } my $p = plustwo_iter(); my $loop = [[0..1], (sub {[$_+1..&$p]}) x ($n-2)]; my $iter = NestedLoops($loop); while (my @list = $iter->()) { output(@list); }