sub P { @_ = @{ shift @_ }; return [ [], rec(@_) ]; sub rec { return () unless @_; map { my $first = shift @_; [$first], map { [ $first, @$_ ] } rec(@_); } @_; } }