print "[", join(", ", @$_), "]\n" for permute( [qw( red green blue )], [qw( north south east west )], [1 .. 3], ); # authored by merlyn sub permute { my $last = pop @_; unless (@_) { return map [$_], @$last; } return map { my $left = $_; map [@$left, $_], @$last } permute(@_); } __DATA__ [red, north, 1] [red, north, 2] [red, north, 3] [red, south, 1] [red, south, 2] [red, south, 3] [red, east, 1] [red, east, 2] [red, east, 3] [red, west, 1] [red, west, 2] [red, west, 3] [green, north, 1] [green, north, 2] [green, north, 3] [green, south, 1] [green, south, 2] [green, south, 3] [green, east, 1] [green, east, 2] [green, east, 3] [green, west, 1] [green, west, 2] [green, west, 3] [blue, north, 1] [blue, north, 2] [blue, north, 3] [blue, south, 1] [blue, south, 2] [blue, south, 3] [blue, east, 1] [blue, east, 2] [blue, east, 3] [blue, west, 1] [blue, west, 2] [blue, west, 3]