如何在Perl中对哈希的键按照数值大小排序
解决方法
Perl默认的sort函数采用字符串字典序排序,要实现哈希键的数值大小排序,只需自定义排序规则即可,具体修改如下:
1. 排序逻辑修改
将你遍历哈希的原有代码:
foreach my $num (sort keys %dir_map) { $path = $paths{$num}; $name = $names{$num}; printf OUT ("%d %s %s\n",$num,$path,$name); }
修改为:
# 使用<=>数值比较运算符定义排序规则 foreach my $num (sort {$a <=> $b} keys %dir_map) { $path = $paths{$num}; $name = $names{$num}; printf OUT ("%d %s %s\n",$num,$path,$name); }
其中<=>是Perl专属的数值比较运算符,会将两侧变量转为数字后比较大小,符合你的数值排序需求。如果需要按数值从大到小降序排列,将规则改为{$b <=> $a}即可。
2. 修复读取代码的笔误
你当前的输入处理代码存在未定义变量的问题,$NumberStr赋值后,后续替换操作误用了未声明的$justNumberStr,会导致运行报错,修正后代码如下:
while(<IN>) { chomp; my @header = split /\s+/; my $header_length = $#header ; if ( /dist_/ ) { my $NumberStr = $header[0] ; $NumberStr =~ s/dist_//; my $justNumber = sprintf("%d",$NumberStr); $names{$justNumber} = $header[2]; # 若你同时用到%dir_map,需同步给%dir_map的对应键赋值 $dir_map{$justNumber} = 1; } }
内容的提问来源于stack exchange,提问作者Shane
相关产品推荐
相关产品推荐

