Perl哈希排序失效求助:排序规则未正常生效
Perl哈希排序问题修正
你的代码存在几个关键问题导致排序无效:
- Perl哈希本身是无序的,无法直接修改哈希的存储顺序,只能通过排序键/值的依据,按顺序遍历输出。
- 你排序的是哈希的
values(数组引用列表),用<=>比较数组引用没有意义——数组引用是标量,比较的是内存地址,不是数组内的numero数值。 - 遍历排序后的列表时,你只是打印原哈希,原哈希的结构不会因为排序
values而改变,自然看不到排序效果。
修正方案(按需求选择)
方案1:调整哈希结构,按numero分组排序
如果你的需求是按sezione标签的numero属性值排序并输出对应内容,建议把numero作为哈希键,存储对应行/内容:
my %hash_section; # 直接遍历数组更简洁,无需索引 for my $line (@xml) { if ($line =~ m/<sezione numero="(.*?)">(.*?)<\/sezione>/i) { my $numero = $1; my $content = $2; # 同一numero的内容存入数组 push @{$hash_section{$numero}}, { line => $line, content => $content }; } } # 按numero数值排序键,遍历输出 foreach my $numero (sort { $a <=> $b } keys %hash_section) { print "Numero: $numero\n"; foreach my $entry (@{$hash_section{$numero}}) { print " 行内容: $entry->{line}\n"; print " 标签内容: $entry->{content}\n"; } }
方案2:保留原哈希结构,按对应numero排序
如果必须保留原哈希的键(整行XML),可以提取每个键对应的numero值作为排序依据:
my %hash_section; for my $y (0..$#xml) { if ($xml[$y] =~ m/<sezione numero="(.*?)">(.*?)<\/sezione>/i) { push @{$hash_section{$xml[$y]}}, $1; } } # 按每个键对应的第一个numero数值排序,遍历输出 foreach my $line (sort { $hash_section{$a}[0] <=> $hash_section{$b}[0] } keys %hash_section) { print "行内容: $line\n"; print "Numero列表: " . join(', ', @{$hash_section{$line}}) . "\n"; }
内容的提问来源于stack exchange,提问作者ezionice
相关产品推荐
相关产品推荐

