配列の並び替え
■この章で解説する組み込み関数
reverse, sort
■この章でできること
・配列の要素を逆順に並び替える
・配列の要素を結合し、逆順に並び替える
・配列の要素を昇順にソートする
・配列の要素を独自の規則でソートする

 配列への要素を逆順に並び替えるにはreverse関数を使います。reverse関数はスカラーコンテキストに対しても使用できます。スカラーコンテキストの場合は、全要素を連結して文字単位で逆順に並び替えます。

reverse
リストの要素を逆順に並び替える。スカラーコンテキストの場合、全ての要素を連結した上で文字単位で逆順にしたものを返す。
書式
reverse list
引数
list:
並べ替え対象のリスト
戻り値
逆順に並べ替えたリスト、またはスカラー値

 配列への要素を昇順にソートするにはsort関数を使います。

sort
デフォルトでは、リストの要素を昇順に並び替える。codeを指定した場合はサブルーチンまたはコードブロックに従ってソートする。
書式
sort [code] list
引数
code:
サブルーチン名またはコードブロック
list:
ソート対象のリスト
戻り値
ソートしたリスト

 それではサンプルを見てみましょう。

#!/usr/bin/perl

#############################################
# 配列のソートのサンプル1
# produced by "Perl Programming Tips"
#############################################

@array = ("def", "abc", "GHI", "jkl");

# 逆順に並び替え
print "before: @array\n";
@array_r = reverse(@array);
print "after : @array_r\n\n";

print "before: @array\n";
$array_r = reverse(@array);
print "after : $array_r\n\n";

# 昇順ソート
print "before: @array\n";
@array_r = sort(@array);
print "after : @array_r\n";

 実行結果は次のようになります。

[g@630m pl]$ perl array_02_01.pl
before: def abc GHI jkl
after : jkl GHI abc def

before: def abc GHI jkl
after : lkjIHGcbafed

before: def abc GHI jkl
after : GHI abc def jkl
[g@630m pl]$

 reverse関数では配列の要素が逆順に並び替えられているのが分かります。sort関数では昇順に並び替えられています。sort関数では、デフォルトでは文字列の大小関係に基づいてソートされます。しかし、独自のソート規則でソートしたい場合もあります。例えば、上のサンプルでは、小文字の文字列より大文字の文字列のほうが先になっていますが、大文字・小文字を区別しないでソートしたい場合などがあります。このような場合はソート用のサブルーチンを使います。以下にそのサンプルを示します。

#!/usr/bin/perl

#############################################
# 配列のソートのサンプル2
# produced by "Perl Programming Tips"
#############################################

@array = ("def", "abc", "GHI", "jkl");

# 昇順ソート(大文字/小文字を区別しない)
print "before: @array\n";
@array_r = sort(sort_func @array);
print "after : @array_r\n";

# ソート用サブルーチン
sub sort_func
{
    $la = lc($a);
    $lb = lc($b);

    return ($la cmp $lb);
}

 実行結果は次のようになります。

[g@630m pl]$ perl array_02_02.pl
before: def abc GHI jkl
after : abc def GHI jkl
[g@630m pl]$

 ここでは、sort関数の第一引数にソート用のサブルーチンを指定しています。サブルーチンの中でlc関数を使って、比較対象を一度小文字に戻してから比較しています。このようにすると大文字・小文字を区別しないでソートすることができます。

 ソート用のサブルーチンには比較対象の変数$aと$bが渡されます。この大小関係を判断して、0未満、0、0以上のどれかを返します。通常の比較であれば<=>やcmp演算子を使うと便利です。もし降順にしたい場合は、戻り値を反転させます。sort関数はソートアルゴリズムに従って、2値の比較用にこのサブルーチンを繰り返し呼び出します。

 また、変数$aと$bは参照渡しされるので、サブルーチンの中で値を変更してはいけません。