基于值升序排序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
相关产品推荐
相关产品推荐

