#!/usr/bin/perl use strict; use warnings; use Digest::MD5 qw( md5_hex ); use List::Util qw( max ); my $participants_qfn = 'santaList.txt'; # Name#email my $previous_qfn = 'lastYear.txt'; # sorted md5 hashes my @participants = do { open(my $fh, '<', $participants_qfn) or die $!; map { /^(.*?)#/ ? $1 : () } <$fh> }; my %previous = do { open(my $fh, '<', $previous_qfn) or die $!; map { /^(.*)/ ? $1 => 1 : () } <$fh> }; my $longest = max map length, @participants; my %givers = map { $_ => 1 } @participants; my %recvers = map { $_ => 1 } @participants; my %gives_to; for my $giver (@participants) { while ( my ($recver) = each %recvers ) { next if $giver eq $recver; my $hash = md5_hex($giver, '=>', $gives_to{$recver}); next if !$previous{$hash}; $gives_to{$giver} = $recver; delete $givers{$giver}; delete $recvers{$recver}; last; } keys %to; # Reset iterator. } { my $fmt = "%-${longest}s => %s\n"; print("Matched\n"); print("=======\n"); printf($fmt, $_, $gives_to{$_}) for sort keys %gives_to; print("Unmatched Givers\n"); print("================\n"); print("$_\n") for sort keys %givers; print("Unmatched Receivers\n"); print("===================\n"); print("$_\n") for sort keys %recvers; }