在Perl中通过多个键动态对哈希数组进行排序

3
在寻找有关如何按多个值对哈希数组进行排序的指针时,我找到了以下解决方案:Sorting array of hash by multiple keys
但是,似乎无法动态地完成这项任务。
假设,如果要排序的参数数量(即哈希键)取决于用户输入,则无法找到解决方法。
使用链接问题中用户使用的相同示例:
$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'           
          }

用户可以选择仅按品牌('brand'),按品牌和供应商('brand'和'supplier')或三者同时排序。
1个回答

7
创建一个子程序来进行排序。它可以接受任意数量的键来进行比较:
use strict;
use warnings;

my @array = (
    { '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' },
);

sub custom_sort {
    my ($x, $y, @keys) = @_;
    for (@keys) {
        my $cmp = $x->{$_} cmp $y->{$_};
        return $cmp if $cmp;
    }
    return 0;
}

my @sorted = sort {custom_sort($a, $b, 'brand', 'supplier', 'PO')} @array;

use Data::Dump;
dd @sorted;

输出:

(
  { brand => "A", PO => 1, supplier => "X" },
  { brand => "A", PO => 2, supplier => "X" },
  { brand => "B", PO => 1, supplier => "X" },
  { brand => "B", PO => 2, supplier => "X" },
  { brand => "B", PO => 1, supplier => "Y" },
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接