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 の並べ替え関数に無名のサブルーチン
を指定し、上記のハッシュの値をソート基準として参照しています。
値は、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〉」(オライリー・ジャパン)
ラリー ウォール他 (著), 近藤 嘉雪 (翻訳)