or download this
die "No match possible" if @people % 2 or @people == 2 and %so_s;
%reverse_so_s = reverse %so_s;
...
@values = values %so_s;
@singles = grep { ! ( exists $so_s{$_} or exists $reverse_so_s{$_} ) }
+ @people;
%matches = ( @keys, @singles, @values );