Another approach to this is to use a
Schwartzian Transform. Here's an example using this approach. Note that the split used here has the advantage of working on people with middle initials, and those with only a one word name. The trinary in the top map is also to deal with those with only a single name.
#!/usr/bin/perl
use warnings;
use strict;
# Note: Read a Schwartzian transform from
# the bottom-up. It makes more sense.
my @names =
# Join the name back together. First name
# output first, and then (And only if a
# surname exists) a comma followed by the
# surname.
map {$_->[1]. ($_->[0]?", $_->[0]":'')}
# Sort the arrays by lastname.
sort {$a->[1] cmp $b->[1]}
# Splits the name on the final spaces, creates
# arrays with [firstname, lastname].
map {/(.*?)\s*(\S+)$/; [$1,$2]}
# All of the output
<>;
print "'$_'\n" foreach @names;