use strict; use warnings; use Algorithm::Combinatorics 'subsets'; $" = ' + '; use constant N => 5; my $i = subsets [ 1 .. N - 1 ]; while () { my $s = '1,' x N; substr $s, 2 * $_ - 1, 1, '+' for @{ $i-> next or last }; print eval( $s = "@{[ eval $s ]}" ), " = $s\n"; } __END__ 5 = 5 5 = 1 + 4 5 = 2 + 3 5 = 1 + 1 + 3 5 = 3 + 2 5 = 1 + 2 + 2 5 = 2 + 1 + 2 5 = 1 + 1 + 1 + 2 5 = 4 + 1 5 = 1 + 3 + 1 5 = 2 + 2 + 1 5 = 1 + 1 + 2 + 1 5 = 3 + 1 + 1 5 = 1 + 2 + 1 + 1 5 = 2 + 1 + 1 + 1 5 = 1 + 1 + 1 + 1 + 1