use List::PowerSet qw/powerset_lazy/; my @set = (0) x $N; my @C = (1) x 2**$N; my $M = 0; my $ps_itr = powerset_lazy(0 .. $N-1); while (my $ref_set = $ps_itr->()) { $_ = 1 for local @set[@$ref_set]; $C[ $M ] *= $arr->[ $_ ][ $set[$_] ] for 0 .. $N-1; $M++; }