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

Perl哈希排序失效求助:排序规则未正常生效

Perl哈希排序问题修正

你的代码存在几个关键问题导致排序无效:

  1. Perl哈希本身是无序的,无法直接修改哈希的存储顺序,只能通过排序键/值的依据,按顺序遍历输出。
  2. 你排序的是哈希的values(数组引用列表),用<=>比较数组引用没有意义——数组引用是标量,比较的是内存地址,不是数组内的numero数值。
  3. 遍历排序后的列表时,你只是打印原哈希,原哈希的结构不会因为排序values而改变,自然看不到排序效果。

修正方案(按需求选择)

方案1:调整哈希结构,按numero分组排序

如果你的需求是按sezione标签的numero属性值排序并输出对应内容,建议把numero作为哈希键,存储对应行/内容:

my %hash_section;
# 直接遍历数组更简洁,无需索引
for my $line (@xml) {
    if ($line =~ m/<sezione numero=&quot;(.*?)&quot;>(.*?)<\/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=&quot;(.*?)&quot;>(.*?)<\/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:36:18