Perl で複数条件sort
業務で10年近くperl触ってるのに、普通にやる機会がなかった。
大体DBのorder by で済ましてる気がする。
ちなみに、ソート対象がundefのものが表にでては具合がわるい仕様なので出さないようにしている。order by のように昇順ではundefのものを最初に、降順では最後にもってくるにはもう一工夫が必要。(mysqlの話です。oracleは昇順だと最後に、降順だと最初だと記憶してます。)
use strict; use warnings; use YAML; my $list = [ { name => 'aaa', hoge => 10, fuga => 1 }, { name => 'bbb', hoge => 11, fuga => 2 }, { name => 'ccc', hoge => 11, fuga => 1 }, { name => 'ddd', hoge => 12, fuga => 1 }, { name => 'eee', hoge => undef, fuga => 1 }, ]; my $sorted_list = [ map { $_->{name} } sort { $a->{hoge} <=> $b->{hoge} or $a->{fuga} <=> $b->{fuga} } grep { defined $_->{hoge} and defined $_->{fuga} } @$list ]; warn YAML::Dump $sorted_list; #--- #- aaa #- ccc #- bbb #- ddd
<=> は両方の値が等価の場合は0が返るので、or で次の条件似つなぐ。条件が増えた場合は更にorでなげば良い。