通过多个键Perl对哈希数组进行排序

Man*_*wat 19 perl

我有一个包含哈希的数组referance(即@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'           
              }
];
Run Code Online (Sandbox Code Playgroud)

我想根据所有三个键(即品牌,供应商和采购订单)对其进行排序.排序顺序应该是品牌优先,然后是供应商,最后是PO.

排序后的数组referance应该是:

$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'       
              },
];
Run Code Online (Sandbox Code Playgroud)

cjm*_*cjm 46

由于<=>cmp返回0,表示平等,这是假的,因为Perl的逻辑布尔运算符返回决定价值,而不是仅仅0或1,由多个按键的排序是与多串在一起比较容易or或者||:

@$arr_ref = sort { $a->{brand}    cmp $b->{brand}    or 
                   $a->{supplier} cmp $b->{supplier} or 
                   $a->{PO}       <=> $b->{PO} 
                 } @$arr_ref;
Run Code Online (Sandbox Code Playgroud)

我假设PO是一个数字字段,所以你用<=>它而不是cmp.


mtt*_*trb 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}
}
Run Code Online (Sandbox Code Playgroud)