読者です 読者をやめる 読者になる 読者になる

NeverBlog::Likk::Unexistable;

見なかったことにして下さい

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でなげば良い。


ところで、件名に悩んだんだけど、どういう言い方をするのが適切なんだろうか。
複数条件ソート?複数指定ソート?