use strict; use warnings; my @vals = ( [1,1,1],[0,0,0],[1,0,1],[0,0,1] ); my $n = 2; my @solutions; nSum(\@vals, \@solutions, [], -1, $n); print "@$_\n" for @solutions; sub nSum { my ($vals, $solutions, $sums, $i, $n) = @_; my (@sums, $j, $k); $n--; for $j (($i+1)..$#$vals) { @sums = @$sums; for $k (0..$#{$vals->[0]}) { $sums[$k] += $vals->[$j][$k]; } if ($n) { nSum($vals, $solutions, \@sums, $j, $n); } else { push @$solutions, [@sums]; } } }