You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl:如何基于数组引用多值对哈希引用进行排序?

Perl 多条件排序实现方案

假设你的哈希引用结构如下(数组元素依次为 Age、Start-Date、Name):

my $hash_ref = {
    IR => [16, '2022-04-01', 'Dave'],
    ZE => [19, '2022-05-31', 'Jill'],
    RW => [17, '2022-08-23', 'Aida'],
    QX => [17, '2022-05-31', 'Jack'],
    FX => [19, '2022-05-23', 'Bill'],
};

要实现先按Age数值升序,Age相同时按Start-Date字符串升序的排序,你可以用以下代码:

# 提取哈希的键并排序
my @sorted_keys = sort {
    # 先比较Age的数值大小
    $hash_ref->{$a}[0] <=> $hash_ref->{$b}[0]
    # 如果Age相等,再比较Start-Date的字符串
    || $hash_ref->{$a}[1] cmp $hash_ref->{$b}[1]
} keys %$hash_ref;

# 遍历排序后的键,输出结果
foreach my $key (@sorted_keys) {
    printf "%s: %d : %s : %s\n", 
        $key, 
        $hash_ref->{$key}[0], 
        $hash_ref->{$key}[1], 
        $hash_ref->{$key}[2];
}

代码说明

  • <=> 是Perl的数值比较运算符,用于Age的数值排序,返回-1、0或1,对应小于、等于、大于。
  • cmp 是字符串比较运算符,因为你的Start-Date是YYYY-MM-DD格式,字符串比较的结果和日期的先后顺序完全一致,直接用它就能实现日期排序。
  • 排序逻辑是短路求值:如果Age比较结果不为0(即两个元素Age不同),就直接用这个结果;如果Age相同,才会执行后面的日期字符串比较。

运行上述代码后,输出将完全符合你的预期:

IR: 16 : 2022-04-01 : Dave
QX: 17 : 2022-05-31 : Jack
RW: 17 : 2022-08-23 : Aida
FX: 19 : 2022-05-23 : Bill
ZE: 19 : 2022-05-31 : Jill

内容的提问来源于stack exchange,提问作者h q

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:24:22