use 5.20.0; use warnings; use Path::Tiny; use List::AllUtils qw/ product /; use experimental qw/ signatures /; my @expenses = path('input')->lines; $, = " "; print product find_group( \@expenses, 2020, 3, [] )->@*; sub find_group($list,$goal,$n,$so_far) { if( $n == 1 ) { if( grep { $_ == $goal } @$list ) { return [ @$so_far, $goal ]; }; return; } my @list = grep { $_ < $goal } @$list; while ( my $next = shift @list ) { my $result = find_group( \@list, $goal - $next, $n-1, [ @$so_far, $next ] ) or next; return $result; } }