我回答了这个用户的另外两个完全相同的问题,但看起来这个会赢,所以我也在这里回答。
从perlfaq4对How do I sort an array by anything的回答?
为 sort() 提供一个比较函数(在 perlfunc 中的 sort 中描述):
@list = sort { $a <=> $b } @list;
默认排序函数是 cmp,字符串比较,它将 (1, 2, 10) 排序为 (1, 10, 2)。上面使用的 <=> 是数值比较运算符。
如果你有一个复杂的函数需要拉出你想要排序的部分,那么不要在排序函数中执行它。先把它拉出来,因为同一个元素可以多次调用sort BLOCK。这是一个示例,说明如何在每个项目的第一个数字之后提取第一个单词,然后不区分大小写地对这些单词进行排序。
@idx = ();
for (@data) {
($item) = /\d+\s*(\S+)/;
push @idx, uc($item);
}
@sorted = @data[ sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ];
也可以这样写,使用一种被称为 Schwartzian 变换的技巧:
@sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [ $_, uc( (/\d+\s*(\S+)/)[0]) ] } @data;
如果您需要对多个字段进行排序,以下范例很有用。
@sorted = sort {
field1($a) <=> field1($b) ||
field2($a) cmp field2($b) ||
field3($a) cmp field3($b)
} @data;
这可以方便地与上面给出的密钥的预先计算相结合。
有关此方法的更多信息,请参阅http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz中“远远超过您想知道的”集合中的排序文章。
另请参阅 perlfaq4 后面关于排序哈希的问题。