sort


■ 複数の基準でソートする

次のようにすると,大文字小文字を区別せずにソートするが,大文字小文字の違いを除き同じ綴りのものについては,大文字を先に並べるようになる。

   @new = sort { lc $a cmp lc $b || $a cmp $b } @old

論理演算子 ||, or は左辺の式を評価した結果が真であれば,右辺の評価を行わず,偽であるときのみ右辺の評価を行う。比較演算子 cmp は両辺が等しいとき 0 を返すので,小文字に変換した結果が同じものについてだけ,さらに $a cmp $b を評価する。この結果,大文字で書かれた方が小文字のものより前にソートされるようになる。

次のように3つ以上並べてもよい。(文字列の長さの大きいものから順番に並べる。同じ長さのものについてはアルファベット順。大文字小文字の違いしかない場合には,大文字を小文字より先にする。)

   { length $a <=> length $b || lc $a cmp lc $b || $a cmp $b }

このように,論理演算子で結合すれば,複数の条件を,順序付けて指定することができる。さらに,if などを使って複雑な条件を指定することもできる。


■ サブルーチンで定義する

ブロックの内容が複雑になるとき,また,何度も同じブロックを使うときは,順序の定義を「サブルーチン」で指定しておき,それを呼び出すようにすると便利である。次のように指定する。(サブルーチンは Lesson 8 で扱う。)

   sub サブルーチン名 { 定義 (処理) }

サブルーチン名を sort の直後に書けば,サブルーチンで定義した順序でソートできる。

   ---------------------------------------
   @new = sort { &by_abc } @old;

   sub by_abc {
      lc $a cmp lc $b  ||  $a cmp $b
   }
   ---------------------------------------

1行目は次のように書くこともできる。{ }& が付いていない点に注意。

   @new = sort by_abc @old;