1 5 7 1 5 4 1 5 9 1 3 7 1 3 4 ... 3 8 4 3 8 9 #### 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__