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