【问题标题】:Sorting an array ref by its value in Perl在 Perl 中按其值对数组 ref 进行排序
【发布时间】:2018-12-05 20:36:04
【问题描述】:

我正在提取 XML 并将值作为参考传递。 参考资料中的数据是

$VAR1 = [ 
    {   
        'tender_data' => [
            {
                'total_mwh' => '191.4600',
                'retailer_code' => 'Origin',
                'client_num' => '20180516-03',
                'response_date' => '2018-05-22',
                'nmi' => 'NGGG000692',
                'month_name' => 'May',
                'ext_date' => '2018-5',
                'client_name' => 'Alpha Hotel Canberra',
                'result' => 'lost'
            }
        ],
        'state' => 'ACT'
    },  
    {   
        'tender_data' => [
            {
                'total_mwh' => '445.6410',
                'retailer_code' => 'ERM Power',
                'client_num' => '20110317-05',
                'response_date' => '2018-05-14',
                'nmi' => 'QB00457566',
                'month_name' => 'May',
                'ext_date' => '2018-5',
                'client_name' => 'Thunderbird Park',
                'result' => 'lost'
            },
            {
                'total_mwh' => '910.2670',
                'retailer_code' => 'AGL',
                'client_num' => '20140625-02',
                'response_date' => '2018-05-24',
                'nmi' => 'QB09015582',
                'month_name' => 'May',
                'ext_date' => '2018-5',
                'client_name' => 'Geewood Pty Ltd',
                'result' => 'undecided'
            },  

            {   
                'total_mwh' => '120.4290',
                'retailer_code' => 'AGL',
                'client_num' => '20180502-02',
                'response_date' => '2018-05-18',
                'nmi' => 'QB00493554',
                'month_name' => 'May',
                'ext_date' => '2018-5',
                'client_name' => 'Beaudesert Race Club Inc',
                'result' => 'won'
            },
        ],
        'state' => 'QLD'
    },
];

现在的问题是我试图按 response_date 对哈希进行排序,但我无法解决它。 我试过这段代码

$data = (sort { join('', (split '-', $data->{$a}->{response_date})[0,1,2]) cmp join('', (split '-', $data->{$b}->{response_date})[0,1,2]) } keys %{$data->{tender_data}});

但它给了我错误-不是哈希参考

所以我尝试对数组 ref 进行排序

$data = sort { join('', (split '-', $a)[0,1,2]) cmp join('', (split '-', $b)[0,1,2]) } @{$data};

但我得到了 undef 值。 如果我使用foreach my $tender(@{$data}){} 循环它,我将获得数据引用中的值

有人可以帮我使用 response_date 对其进行排序吗 我需要对它进行排序

{
    'total_mwh' => '445.6410',
    'retailer_code' => 'ERM Power',
    'client_num' => '20110317-05',
    'response_date' => '2018-05-14',
    'nmi' => 'QB00457566',
    'month_name' => 'May',
    'ext_date' => '2018-5',
    'client_name' => 'Thunderbird Park',
    'result' => 'lost'
},
{
    'total_mwh' => '120.4290',
    'retailer_code' => 'AGL',
    'client_num' => '20180502-02',
    'response_date' => '2018-05-18',
    'nmi' => 'QB00493554',
    'month_name' => 'May',
    'ext_date' => '2018-5',
    'client_name' => 'Beaudesert Race Club Inc',
    'result' => 'won'
},

{
    'total_mwh' => '910.2670',
    'retailer_code' => 'AGL',
    'client_num' => '20140625-02',
    'response_date' => '2018-05-24',
    'nmi' => 'QB09015582',
    'month_name' => 'May',
    'ext_date' => '2018-5',
    'client_name' => 'Geewood Pty Ltd',
    'result' => 'undecided'
},

【问题讨论】:

  • 你有一个哈希数组,其中一个键有一个哈希数组作为值。你能更具体地说明你想要排序吗?您能否提供一个排序的预期输出示例?
  • 我需要按响应日期排序的最后一个哈希
  • 最后一个哈希”是什么意思?哈希本质上是无序的。例如,您可以按排序打印它,或重新排列(排序)数组中的 hashrefs(您似乎显示的内容)。您可以编辑“排序”示例以显示您想象的排序的整个数据结构吗?请修正缩进?
  • 第二个例子的数据与第一个不同。这是您希望如何排序的示例,还是要对另一个数据集进行排序?请编辑以阐明您要执行的操作。
  • 这看起来像 XML::Simple 输出。是吗?使用不同的方法是有原因的,这会让你的很多问题成为争论的焦点。

标签: arrays perl sorting hash


【解决方案1】:

给定一个哈希数组:

$data = [
  {'response_date' => '2018-05-18', 'client_name' => 'Beaudesert Race Club Inc'},
  {'response_date' => '2018-05-14', 'client_name' => 'Thunderbird Park'},
  {'response_date' => '2018-05-24', 'client_name' => 'Geewood Pty Ltd'},
];

您可以使用'response_date' 键对其进行排序:

sort {$$a{response_date} cmp $$b{response_date}} @$data

例如:

# perl -MData::Dumper
$data = [
  {'response_date' => '2018-05-18', 'client_name' => 'Beaudesert Race Club Inc'},
  {'response_date' => '2018-05-14', 'client_name' => 'Thunderbird Park'},
  {'response_date' => '2018-05-24', 'client_name' => 'Geewood Pty Ltd'},
];
print Dumper([sort {$$a{response_date} cmp $$b{response_date}} @$data]);
$VAR1 = [
          {
            'client_name' => 'Thunderbird Park',
            'response_date' => '2018-05-14'
          },
          {
            'response_date' => '2018-05-18',
            'client_name' => 'Beaudesert Race Club Inc'
          },
          {
            'client_name' => 'Geewood Pty Ltd',
            'response_date' => '2018-05-24'
          }
        ];

【讨论】:

  • 我的 var 值为 var1 = [{ 'tender_data' => [ { 'client_num' => '20110317-05', 'response_date' => '2018-05-14', }, { 'client_num' => '20140625-02', 'response_date' => '2018-05-24', }, { 'client_num' => '20180502-02', 'response_date' => '2018-05-18' , }, ], 'state' => 'QLD' },] 我试过但没有得到值,显示 $var1 = undef
  • 使用箭头运算符 sort {$a->{response_date} cmp $b->{response_date}} @$data 或至少附加大括号 sort {${$a}{response_date} cmp ${$b}{response_date}} @$data 更具可读性
猜你喜欢
  • 2011-03-17
  • 1970-01-01
  • 2015-01-04
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2020-03-29
相关资源
最近更新 更多