このユーザーからの他の2つのまったく同じ質問に答えましたが、これが勝つように見えるので、ここでも答えます.
perlfaq4の回答から、どのようにして配列を並べ替えますか?
sort() に比較関数を提供します (perlfunc の sort で説明されています):
@list = sort { $a <=> $b } @list;
デフォルトの並べ替え関数は cmp、文字列比較で、(1, 2, 10) を (1, 10, 2) に並べ替えます。上記で使用されている <=> は、数値比較演算子です。
並べ替えたい部分を引き出すために複雑な関数が必要な場合は、並べ替え関数内で実行しないでください。並べ替え BLOCK は同じ要素に対して何度も呼び出される可能性があるため、最初に引き出します。各アイテムの最初の数字の後の最初の単語を取り出し、大文字と小文字を区別せずにそれらの単語を並べ替える方法の例を次に示します。
@idx = ();
for (@data) {
($item) = /\d+\s*(\S+)/;
push @idx, uc($item);
}
@sorted = @data[ sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ];
これは、シュワルツ変換として知られるようになったトリックを使用して、このように書くこともできます。
@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 の後半の質問も参照してください。