sort関数についてのメモ
sort関数には3つの構文があります。
- 1の構文:sort LIST
- 2の構文:sort SUB LIST
- 3の構文:sort BLOCK LIST
1の構文例
@list = (0,1,2,3,4,5,6,7,8,9,10,11,12); @result = sort @list;
これで@listには、(0,1,10,11,12,2,3,4,5,6,7,8,9)というリストになります。
これを数値の値順にしたい場合、2番目と3番目の構文を使います。
まず、2番目の構文を使う場合、二つの数値を比較する次のようなサブルーチンが必要になります。
2の構文例
sub number { if ($a < $b) { return -1; } elsif ($a == $b) { return 0; } elsif ($a > $b) { return 1; } } @result = sort number @list;
実は、このサブルーチンは、便利な『<=>』という演算子を使うと以下のように簡単に記述できます。
sub number { $a <=> $b; } @result = sort number @list;
これで@listには、(1,2,3,4,5,6,7,8,9,10,11,12)というリストになります。
尚、$a と $b は、sort関数が内部で使う専用変数なので、変更してはなりません。
また、my宣言してもなりません。my宣言しなくても、strictになりますので大丈夫。
3の構文例
プログラム中でこのようなソートを複数回使うのなら、サブルーチンでもいいのですが、
一度しか使わないのなら、sortの3番目の構文を使ってサブルーチンを使わず、以下のように記述します。
@result = sort {$a <=> $b } @list;
尚、数値の比較は <=> ですが、文字列の比較は cmp を使用します。