perlでちょっと複雑なソート2
昨日のエントリの最後で、use sortプラグマを使うことで、perlのソートに安定性を保証することができるという話を書いた。
そこで今回は、これを使って先日のソースを改良してみる。
#! /usr/bin/perl use 5.010; use sort 'stable'; while (<>) { push @lines, $_; $pref = (split)[1]; $pref{$_} = $pref; $priority{$pref} //= ++$count; } for (sort { $priority{$pref{$a}} <=> $priority{$pref{$b}} } @lines) { print; }
安定ソート(perldocによれば、マージソートのようだ)を使うことで、ソートのルールを一つ減らしている。
つまり、city_priorityがなくなり、pref_priorityだけになっている(この際だから名前はpriorityにする)。
実行結果は以下の通り。
今度は市区町村から都道府県へのハッシュではなく、行から都道府県へのハッシュにした。
それでprintfも使っていないので、表示もずれなくなった。OK。
$ cat city.txt 京都市 京都府 千代田区 東京都 高岡市 富山県 松本市 長野県 宮津市 京都府 川崎市 神奈川県 諏訪市 長野県 渋谷区 東京都 滑川市 富山県 新宿区 東京都 臼杵市 大分県 稚内市 北海道 氷見市 富山県 いわき市 福島県 長野市 長野県 横須賀市 神奈川県 宇治市 京都府 $ ./sort2.pl city.txt 京都市 京都府 宮津市 京都府 宇治市 京都府 千代田区 東京都 渋谷区 東京都 新宿区 東京都 高岡市 富山県 滑川市 富山県 氷見市 富山県 松本市 長野県 諏訪市 長野県 長野市 長野県 川崎市 神奈川県 横須賀市 神奈川県 臼杵市 大分県 稚内市 北海道 いわき市 福島県