次のようにすると,大文字小文字を区別せずにソートするが,大文字小文字の違いを除き同じ綴りのものについては,大文字を先に並べるようになる。
@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;