If you are dealing with lotsa data, the so-called Guttman-Rosler Transform (GRT, the second technique below; see A Fresh Look at Efficient Perl Sorting, which discusses both ST and GRT techniques) may be faster:
c:\@Work\Perl>perl -wMstrict -le
"use Test::More 'no_plan';
use Test::NoWarnings;
;;
VECTOR:
for my $ar_vector (
[ [ qw(fanfare apparate panacea parmesan albatross albacore false v
+ermeil candelabra beans) ],
[ qw(apparate fanfare panacea albatross albacore false parmesan c
+andelabra beans vermeil) ],
],
) {
my ($ar_unsorted, $ar_expected) = @$ar_vector;
my @unsorted = @$ar_unsorted;
note qq{input: @$ar_unsorted};
;;
my @sorted =
map $_->[0],
sort { $a->[1] cmp $b->[1] }
map [ $_, join '', m{ [aeiou]+ }xmsg ],
@unsorted
;
is_deeply \@sorted, $ar_expected, qq{ST: @sorted};
;;
@sorted =
map { (split m{ \x00 }xms)[1] }
sort
map join(qq{\x00}, join('', m{ [aeiou]+ }xmsg), $_),
@unsorted
;
is_deeply \@sorted, $ar_expected, qq{GRT: @sorted};
;;
is_deeply \@unsorted, $ar_unsorted, qq{input data unchanged};
}
"
# input: fanfare apparate panacea parmesan albatross albacore false ve
+rmeil candelabra beans
ok 1 - ST: apparate fanfare panacea albatross albacore false parmesan
+ candelabra beans vermeil
ok 2 - GRT: apparate fanfare panacea albatross albacore false parmesan
+ candelabra beans vermeil
ok 3 - input data unchanged
ok 4 - no warnings
1..4
Update: The
map join(qq{\x00}, join('', m{ [aeiou]+ }xmsg), $_),
expression in the GRT sort above is rather messy. A neater (tested) version is
map join('', m{ [aeiou]+ }xmsg, qq{\x00}, $_),