sub cross { my $f = shift or return; # Nothing. @_ or return map {[$_]} @{$f}; # Handle one argument. my @r = cross(@_); # Recurse. map {my $l = $_; map {[$l, @$_]} @r} @$f; # Distribute. }