sub ret_iter4 { my @ranges = @_; my $last=1; $last *= @$_ for @ranges; my $iteration=0; return sub { return if $iteration >= $last; my $i = $iteration++; my $possibilities = $last; map { $possibilities /= @$_; my $this_iter_i = $i / $possibilities; $i %= $possibilities; $_->[$this_iter_i]; } @ranges; } }