Perl中基于age键对哈希列表排序失败的问题排查
问题排查:哈希列表按age排序失效的原因
我来帮你揪出这个排序没生效的问题——核心原因是你的排序子例程byage完全错配了你的数据结构!
问题分析
你的@class数组里存储的是哈希引用,但你在byage里写的$age{$a} <=> $age{$b}犯了两个关键错误:
- 你根本没定义过
%age这个哈希,所以$age{$a}的结果是undef,两边都是undef的话,<=>比较结果永远是0,相当于所有元素“相等”,自然不会产生排序效果。 sort函数里的$a和$b在这里代表的是@class里的哈希引用,不是某个哈希的键,你需要直接访问引用里的age字段,而不是去另一个不存在的哈希里找值。
修正后的代码
把排序子例程改成直接访问哈希引用的age键即可,另外建议用数组引用传给Dumper,输出可读性更好:
use Data::Dumper; sub byage { $a->{age} <=> $b->{age}; # 直接操作哈希引用的age字段 } my @class = ( { student => "student1", age => 33, }, { student => "student2", age => 66, }, { student => "student3", age => 44, }, ); my @sortedclass = sort byage @class; print "Original list:\n", Dumper(\@class); print "\nSorted by age (ascending):\n", Dumper(\@sortedclass);
效果验证
修正后运行代码,@sortedclass会按照age从小到大排序,输出结果会显示student1(33)、student3(44)、student2(66)的顺序。
内容的提问来源于stack exchange,提问作者PaulM
相关产品推荐
相关产品推荐

