sub recursive ($$$) {
  my ($matrix, $left, $stratum) = @_;

  foreach my $oe (@{$matrix->[$stratum]}) {
    my @tube = (@$left, $oe);

    if ($stratum+1 >= @$matrix) {
      print (join(',', @tube), "\n");
    } else {
      recursive ($matrix, \@tube, $stratum+1);
    }
  }
}


my @matrix = (
  [1, 2, 3],
  ['a', 'b', 'c'],
  ['X', 'Y', 'Z'],
);

recursive (\@matrix, [], 0);

これでmatrixが二次元配列である限り大丈夫かな