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
相关产品推荐
相关产品推荐

