The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;
use List::NSect;
use List::Util qw{shuffle};

=head1 NAME

List-NSect-card-dealer.pl - List::NSect Card Dealer

=head1 SEE ALSO

L<Games::Cards>

=cut

$|          = 1;
my $players = shift || 4;
my @deck    = ();
my $sort    = 1;

#build the deck

foreach my $suit (qw{C D H S}) {
  foreach my $card (qw{2 3 4 5 6 7 8 9 10 J Q K A}) {
    push @deck, {card=>$card, suit=>$suit, sort=>$sort++};
  }
}

#shuffle

my @shuffle=shuffle @deck;

#List::Util::shuffle is MUCH better than in real life.

#TODO: cut

#build the kitty first as nsect would keep dealing the extras like for War or Crazy Eights

my @kitty=();
while (@shuffle % $players) {
  push @kitty, pop @shuffle;
}

#deal the hands

my @hands=nsect($players, @shuffle);

#Note: nsect did not "deal" the cards since it gave the first player all of thier cards then the second player and so forth.

#play

my $i=1;
foreach my $hand (@hands) {
  printf "%s: %s\n", $i++,
    join(", ", 
      map {sprintf("%s%s", $_->{"card"}, $_->{"suit"})}
        sort {$a->{"sort"} <=> $b->{"sort"}}
          @$hand);
}

printf "Kitty: %s\n",
   join(", ",
      map {sprintf("%s%s", $_->{"card"}, $_->{"suit"})}
        sort {$a->{"sort"} <=> $b->{"sort"}}
          @kitty);