这是我的解决方案,不需要任何模块,并且可以处理任意数量的集合。
sub set_product {
my @array_of_aref = @_;
if (@array_of_aref == 0) {
return;
}
elsif (@array_of_aref == 1) {
return $array_of_aref[0];
}
elsif (@array_of_aref >= 2) {
my $array_a = shift @array_of_aref;
my $array_b = shift @array_of_aref;
my @array_c;
foreach my $a ($array_a->@*) {
foreach my $b ($array_b->@*) {
if (ref $a eq "" and ref $b eq "") {
push @array_c, [$a, $b];
}
elsif (ref $a eq "ARRAY" and ref $b eq "") {
push @array_c, [$a->@*, $b];
}
elsif (ref $a eq "" and ref $b eq "ARRAY") {
push @array_c, [$a, $b->@*];
}
elsif (ref $a eq "ARRAY" and ref $b eq "ARRAY") {
push @array_c, [$a->@*, $b->@*];
}
}
}
while (my $aref = shift @array_of_aref) {
@array_c = set_product(\@array_c, $aref);
}
return @array_c;
}
}
示例:
print $_->@* foreach set_product(["a","b"]);
print $_->@* foreach set_product(["a","b"], [1,2,3]);
print $_->@* foreach set_product(["a","b"], [1,2,3], ["x","y"]);
print $_->@* foreach set_product(["a","b"], [1,2,3], ["x","y"], ["E","F"]);
Math::Cartesian::Product
的提及。 - Cascabel