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

基于值升序排序Perl哈希键,值相同时按键升序排列

解决方案

直接修正排序逻辑

你只需要在sort的比较块中添加key数值的二次排序规则即可。当两个key对应的value相等时,通过$a <=> $b(数值比较)来决定顺序,代码修改如下:

#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper;

my %hash = (
          '11' => 1,
          '315' => 4,
          '27' => 3,
          '60' => 4,
          '8' => 3,
          '4' => 2
);

# 先按value升序,value相等时按key的数值升序
my @keys = sort { $hash{$a} <=> $hash{$b} || $a <=> $b } keys(%hash);
print Dumper(\@keys);

执行后会输出你期望的结果:

$VAR1 = [
          '11',
          '4',
          '8',
          '27',
          '60',
          '315'
        ];

关于Tie::SortHash的使用

Tie::SortHash可以让哈希在遍历(比如keys、each操作)时自动返回排序后的结果,但对于只需要一次获取排序keys列表的场景,直接用sort更高效、更轻量,不需要额外引入模块。

如果一定要用Tie::SortHash,示例代码如下(需要先安装该模块):

#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper;
use Tie::SortHash;

my %hash = (
          '11' => 1,
          '315' => 4,
          '27' => 3,
          '60' => 4,
          '8' => 3,
          '4' => 2
);

# 绑定哈希并指定排序规则
tie %hash, 'Tie::SortHash', sub { $a <=> $b }, sub { $hash{$a} <=> $hash{$b} || $a <=> $b };

my @keys = keys %hash;
print Dumper(\@keys);

不过这个方案必要性不高,除非你需要哈希始终保持排序状态,否则直接用sort是更优选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:24:55