my @sorted = map { $_->[0] } sort { $a->[1] cmp $b->[1] } # or <=>, or $b before $a map { [$_, f($_)] } @unsorted; #### # the first map does this qw(8 11 9 4 3) --> ( [ 8, "viii"], [11, "xi"], [ 9, "ix"], [ 4, "vi"], [ 3, "iii"], ) #### # the sort does this: ( [ 8, "viii"], [11, "xi"], [ 9, "ix"], [ 4, "vi"], [ 3, "iii"], ) --> ( [ 3, "iii"], [ 9, "ix"], [ 4, "vi"], [ 8, "viii"], [11, "xi"], ) #### ( [ 3, "iii"], [ 9, "ix"], [ 4, "vi"], [ 8, "viii"], [11, "xi"], ) --> qw( 3 9 4 8 11 ) #### use strict; use warnings; use Roman (); my @unsorted = qw(8 11 9 4 3); *f = \&Roman::roman; my @sorted = map { $_->[0] } sort { $a->[1] cmp $b->[1] } # or <=>, or $b before $a map { [$_, f($_)] } @unsorted; print "@sorted\n"; __END__ # output shown below 3 4 9 8 11 #### my @sorted = sort { f($a) cmp f($b) } @unsorted; #### *f = sub { $::count++; END { print "f() called $::count times\n" }; goto \&Roman::roman; }; #### use List::Util "shuffle"; my @unsorted = shuffle(1..100);