23

ハッシュ (つまり @AOH) を含む配列参照があります。

$arr_ref = [ { 'brand' => 'A',
               'supplier' => 'X',
               'PO' => '2'
              },
              { 'brand' => 'B',
                'supplier' => 'Y',
                'PO' => '1'       
              },
              { 'brand' => 'B',
                'supplier' => 'X',
                'PO' => '2'           
              },
              { 'brand' => 'A',
                'supplier' => 'X',
                'PO' => '1'
              },
              { 'brand' => 'B',
                'supplier' => 'X',
                'PO' => '1'           
              }
];

3 つのキーすべて (つまり、ブランド、サプライヤー、PO) に基づいて並べ替えたいと考えています。並べ替えの順序は、最初にブランド、次にサプライヤー、最後に PO である必要があります。

並べ替え後の配列参照は次のようになります。

$arr_ref = [ { 'brand' => 'A',
                'supplier' => 'X',
                'PO' => '1'
              },
              { 'brand' => 'A',
               'supplier' => 'X',
               'PO' => '2'
              },
              { 'brand' => 'B',
                'supplier' => 'X',
                'PO' => '1'           
              },
              { 'brand' => 'B',
                'supplier' => 'X',
                'PO' => '2'           
              },              
              { 'brand' => 'B',
                'supplier' => 'Y',
                'PO' => '1'       
              },
];
4

3 に答える 3

53

<=>cmpは0を返し、等しいことを示します。これは誤りです。Perlの論理ブール演算子は0または1ではなく決定値を返すため、複数のキーによる並べ替えは、複数の比較をororと一緒に文字列化するのと同じくらい簡単||です。

@$arr_ref = sort { $a->{brand}    cmp $b->{brand}    or 
                   $a->{supplier} cmp $b->{supplier} or 
                   $a->{PO}       <=> $b->{PO} 
                 } @$arr_ref;

POは数値フィールドであると想定しているので、<=>の代わりにPOを使用しますcmp

于 2012-05-01T08:45:10.693 に答える
6

以下は、配列参照をソートし、配列を に戻す必要があります$arr_ref

$arr_ref = [sort by_brand_supplier_PO @$arr_ref];

sub by_brand_supplier_PO {
    $a->{brand} cmp $b->{brand} ||
    $a->{supplier} cmp $b->{supplier} ||
    $a->{PO} <=> $b->{PO}
}
于 2012-05-01T08:51:43.390 に答える
2

Sort::Keyで配布されている Sort ::Key::Multiを使用できます。

この場合、ssikeysort文字列、文字列、および整数を返すブロックを期待し、そのタプルで値をソートする を使用しています。( sinssiは文字列を表し、iは整数を表します。)

use Sort::Key::Multi qw(ssikeysort);

@$arr_ref = ssikeysort { $_->{brand}, $_->{supplier}, $_->{PO} } @$arr_ref;

メモリ使用量が少ないインプレース バリアントを使用することもできます。

use Sort::Key::Multi qw(ssikeysort_inplace);

ssikeysort_inplace { $_->{brand}, $_->{supplier}, $_->{PO} } @$arr_ref;
于 2015-03-04T12:17:24.677 に答える