sub combinations { my @arrays = @_; my @odometer = (0) x @arrays; my $DONE = grep @$_ == 0, @arrays; return sub { return if $DONE; my $result = [map $arrays[$_][$odometer[$_]], 0 .. $#odometer]; my $i = 0; $odometer[$i++] = 0 while $odometer[$i] == $#{$arrays[$i]}; $DONE++ if $i == @odometer; $odometer[$i]++; return $result; }; } my $it = combinations( [ 'a', 'b', 'c' ], [ '-' ], [ 1, 2 ], ); while (my $x = $it->()) { print "@$x\n"; }