use warnings; use strict; sub cartesian_product { @_ or return []; my @last = @{pop()}; map { my @x = @$_; map { [@x, $_] } @last } cartesian_product(@_); } my @columns = ([1, 2, 5, 7, 3], [5, 3, 1, 8], [7, 4, 9]); my @r = cartesian_product(@columns); for (@r) { print join(" ", @$_), "\n"; } __END__