If you want to abstract it a little step farther you can get rid of 5 levels of nested looping. All you're doing is looking at all subsets of cards. So using the power-set iterator from
(tye)Re: Finding all Combinations, the code becomes much more high-level and reads more naturally: "For each subset of cards, check if their sum is 15" ... Whether it's overkill for cribbage, the OP must decide. I know cribbage is not usually generalized to >5 card hands ;)
use List::Util 'sum';
sub combinations { ... } ## from [id://128293]
my @c = split /,/, $hand;
my $total = 0;
my $iter = combinations(@c);
while (my @subset = $iter->()) {
$total += 2 if 15 == sum @subset;
}
You could also check for pairs inside that while loop, although runs would have to be calculated somewhere else.