use Algorithm::Loops qw( NestedLoops ); use List::Util qw( reduce sum ); sub mul { return reduce { $a * $b } @_; } NestedLoops( [ map { [ 0..$n_ra->[$_] ] } 0..$#$n_ra ], sub { $prob_ra[sum @_] += mul map { $f_raa->[$_]->[$_[$_]] } 0..$#_; } );