studies

いろいろ勉強用備忘録的な感じ

perlでちょっと複雑なソート2

昨日のエントリの最後で、use sortプラグマを使うことで、perlのソートに安定性を保証することができるという話を書いた。

studies.hatenablog.com


そこで今回は、これを使って先日のソースを改良してみる。

#! /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 
京都市      京都府
宮津市      京都府
宇治市      京都府
千代田区    東京都
渋谷区      東京都
新宿区      東京都
高岡市      富山県
滑川市      富山県
氷見市      富山県
松本市      長野県
諏訪市      長野県
長野市      長野県
川崎市      神奈川県
横須賀市    神奈川県
臼杵市      大分県
稚内市      北海道
いわき市    福島県