Perl で指定順に並べ替える

Perl でリストを指定順に並べ替えるコードを紹介します。

例えば、社長→部長→課長→係長→主任 の順で並べ替えをしたい、などの時に利用できます。

Perl で指定順に並べ替えるコードサンプル

※プログラミングの文字コードが Shift_JIS ではエラーになる場合があります。UTF-8 がお勧めです。

@target = qw(主任 課長 係長 社長 部長);

%order = (
(
    '社長' => 1,
    '部長' => 2,
    '課長' => 3,
    '係長' => 4,
    '主任' => 5,
);

@result = sort {
        $order{$a} <=> $order{$b}
    }
    @target;

foreach (@result){
    print $_;
}

解説

上のコードを実行すると、「社長部長課長係長主任」と出力されます。

まず、ハッシュ %order のキーに並べ替え対象の文字列を、値に並べ替える順番を数値で指定しています。

sort の並べ替え関数に無名のサブルーチン

 { $order{$a} <=> $order{$b} }

を指定し、上記のハッシュの値をソート基準として参照しています。

値は、sort で意図したとおりに並び替えられるものなら、数値でも文字列でも何でもよいです。

指定順並べ替えの応用例

上記のサンプルだけだと、これで何ができるんじゃい、という感じですが、以下の用に応用すると、ちょっと業務ツールっぽいですね。

%employee = (
    '023042' => ['部長', '山田太郎', 59], #役職,氏名,年齢
    '024019' => ['係長', '後藤由紀', 32],
    '024321' => ['係長', '齊藤次郎', 36],
    '025003' => ['主任', '林健一郎', 27],
    '025019' => ['課長', '鈴木一朗', 42],
);

foreach (sort {
    $order{$employee{$a}->[0]} <=> $order{$employee{$b}->[0]} #まずは役職順
            ||
    $employee{$b}->[2] <=> $employee{$a}->[2] #役職が同じ場合、年齢降順
    } keys %employee){

    print "$employee{$_}->[0]\t$employee{$_}->[1]\n"; #役職と氏名を書き出し

}

おまけ

「sort」=「並べ替え」かと思っていましたが、英語の「sort」というのは、記号とか数値とかに従って順番を整理することを意味します。
指定順というのは、「planned order」と表現するようです。

参考書

「プログラミングPerl〈VOLUME1〉」(オライリー・ジャパン)
ラリー ウォール他 (著), 近藤 嘉雪 (翻訳)

「プログラミングPerl〈VOLUME2〉」(オライリー・ジャパン)
ラリー ウォール他 (著), 近藤 嘉雪 (翻訳)