LIST
をソートし、ソートされた配列を返す。
配列中の存在しない値は除かれる。
SUBROUTINE
または BLOCK
を省略すると、
標準的な文字列比較の順でソートする。
SUBROUTINE
を指定するときは、配列の要素の並べ替えかたに応じて、
0 より小、0、0 より大の整数値を返すサブルーチンの名前を指定する。
(このためのサブルーチンにおいては、
<=>
や cmp
といった演算子が大変便利である。)
SUBROUTINE
はスカラー変数の名前でもよい。
この場合その変数の値が使用するサブルーチンの名前を表す。
サブルーチン名の代わりに任意の BLOCK を指定して、
インラインのソートサブルーチンとすることができる。
効率を良くするため、通常のサブルーチンコールをとばしている。
このため、次の影響がある。
サブルーチンは再帰的であってはならない。
また、比較される 2 要素は @_
を通じてではなく、
$a
と $b
を通じてサブルーチンに渡される。(以下の例を参照。)
これらは参照渡しであるので、$a
と $b
を変更してはいけない。
例:
# 辞書順でソート
@articles = sort @files;
# 同様のものでソートルーチンを明示したもの
@articles = sort {$a cmp $b;} @files;
# 同様のもので逆順
@articles = sort {$b cmp $a;} @files;
# 数値的に昇順にソート
@articles = sort {$a <=> $b;} @files;
# 数値的に降順にソート
@articles = sort {$b <=> $a;} @files;
# 明示的なサブルーチン名でソート
sub byage {
$age{$a} <=> $age{$b}; # 整数であると仮定している
}
@sortedclass = sort byage @class;
sub reverse { $b cmp $a; }
@harry = ('dog','cat','x','Cain','Abel');
@george = ('gone','chased','yz','Punished','Axed');
print sort @harry;
# 出力は AbelCaincatdogx
print sort reverse @harry;
# 出力は xdogcatCainAbel
print sort @george, 'to', @harry;
# 出力は AbelAxedCainPunishedcatchaseddoggonetoxyz