use strict; use Data::Dumper; my @firstArray = ( "item1", "item2", "item3" ); my $n = @firstArray; my @results; for my $i (1..2**$n-1) { my @selection; for my $j (0..$n-1) { if ($i & 2**$j) { push @selection, $firstArray[$j]; } } push @results, \@selection; } print Dumper(\@results);