小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

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 を使用します。