good chemistry is complicated,and a little bit messy -LW PerlMonks

### Re: Generating all possible combinations from an AoA

by LanX (Bishop)
 on Apr 13, 2011 at 12:42 UTC ( #899174=note: print w/replies, xml ) Need Help??

#### Approaches:

##### 1.Metaprogramming

Generate dynamically a string of the above code with all nesting and eval it. (fast and intuitive!)

##### 2. Recursion

Write a function X2() which gets two arrayrefs and returns an arr_ref of the cross product. Call it recursively until @array exceeded.

##### 3. Reduce

is a variation of the above, with List::Util::reduce

```use Data::Dumper;

#- crossproduct of two array refs
sub X2 {
my (\$a,\$b)=@_;
my @result;
for my \$x (@\$a) {
for my \$y (@\$b) {
unless (ref(\$x) eq "ARRAY"){
push @result, [\$x,\$y];
}else{
push @result, [(@\$x,\$y)];
}
}
}
return \@result;
}

use List::Util qw/reduce/;

#- crossproduct of list of array refs
sub X { reduce { X2(\$a,\$b) } @_ }

my @array = (
[ "a", "b", "c", ],
[ "1", "2", "3", "4", ],
[ "x", "y", ],
);

print Dumper X(@array);

The function X() now works somehow like the X operator in perl6, but of course you could also use reduce { X2(\$a,\$b) } @array directly.

The function X2() could be rewritten with two nested maps, but thats a little two cryptic for my taste.

##### 1. Glob

that's a hack which only works for strings as element type, everything else will be stringified, eg refs!!!

Cheers Rolf

* just noticed that you only want a simple concatenation of strings. That simplifies the code...

* There is a problem with this code .. the first one to spot it gets upvoted! :)

Create A New User
Node Status?
node history
Node Type: note [id://899174]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (8)
As of 2018-06-19 22:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Should cpanminus be part of the standard Perl release?

Results (115 votes). Check out past polls.

Notices?