use strict; use warnings; use Data::Dumper; my $MTX = [ [4,-1,-2,-2, 0,-1], [-1,5, 0, 2,-3, 1], [-2,0, 6, 1,-3, 5], [-2,2, 1, 7,-3, 0], [0,-3,-3,-3, 8,-3], [-1,1, 5, 0,-3, 9], ]; my (@diagonal, @result); my $k = 3; for my $i (0..5) { push @diagonal, $MTX->[$i][$i]; } for my $i (0..5) { for my $j (0..5) { for my $k (0..5) { next if $i == $j or $i == $k or $j == $k; my $sc; $sc += $diagonal[$_] for ($i, $j, $k); next unless defined $sc; next if $sc < 17; push @{$result[$sc]}, [$i, $j, $k]; } } } print Dumper \@result;