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

如何在去重后按XML格式正确结束层级输出?

解决XML风格嵌套输出的关闭时机问题

我完全懂你想要的效果——就像XML标签那样,先打开父层级,把所有子内容处理完,再按相反顺序一层一层关闭。你现在的问题核心就是:代码在处理单个条目时就急着关闭上层标签了,没等同一层级下的所有内容都处理完。

问题出在哪?

你用的%seen和%again哈希逻辑不对:它们只判断内容是否第一次出现,导致处理完某个description下的第一个item后,立刻就关闭了description,连同一个description下的其他item都没处理;同理category也被过早关闭。另外,哈希的keys是无序的,这也会让输出顺序乱掉,完全不符合你要的嵌套层级逻辑。

修正后的代码思路

咱们换个方式,先把数据整理成多层级嵌套结构,这样就能清晰控制每个层级的开启和关闭时机,再按层级遍历输出:

my @Input = (
    "Crockery breakable plates colors width",
    "Crockery breakable glasses colors volume",
    "Cutlery bendable forks steel chrome",
    "Cutlery bendable spoons plastic white",
    "Cutlery bendable spoons steel brown"
);

# 第一步:把数据整理成多层级结构:分类 → 描述 → 物品 → 属性列表
my %data;
foreach my $line (@Input) {
    my ($category, $desc, $item, @attrs) = split /\s+/, $line;
    push @{$data{$category}{$desc}{$item}}, join(" ", @attrs);
}

# 第二步:按层级遍历,严格遵循「开标签→处理子内容→关标签」的逻辑
foreach my $category (sort keys %data) {
    # 开启当前分类
    print "1.Start catergory\n";
    print "---$category\n";
    
    foreach my $desc (sort keys %{$data{$category}}) {
        # 开启当前描述
        print "2.----Start description\n";
        print "------ $desc\n";
        
        foreach my $item (sort keys %{$data{$category}{$desc}}) {
            # 处理当前物品
            print "3.------Start of value\n";
            print "-------- $item\n";
            print join(" | ", @{$data{$category}{$desc}{$item}}) . "\n";
            print "3.------End of value\n";
        }
        
        # 所有物品处理完,才关闭当前描述
        print "2.----End Description\n";
    }
    
    # 所有描述处理完,才关闭当前分类
    print "1.End Catergory\n";
}

代码为啥能解决问题?

  1. 多层级结构清晰:%data把数据按「分类→描述→物品」的层级存起来,能明确看到每个分类下的所有内容,不会混乱;
  2. 遍历顺序可控:用sort keys保证输出顺序稳定(你可以根据需求调整排序规则);
  3. 嵌套逻辑严谨:完全遵循「先开父标签,处理完所有子内容再关父标签」的规则,完美匹配你要的XML风格输出。

最终输出效果

运行这段代码后,就能得到你期望的结果:

1.Start catergory
---Crockery
2.----Start description
------ breakable
3.------Start of value
-------- glasses
colors volume
3.------End of value
3.------Start of value
-------- plates
colors width
3.------End of value
2.----End Description
1.End Catergory
1.Start catergory
---Cutlery
2.----Start description
------ bendable
3.------Start of value
-------- forks
steel chrome
3.------End of value
3.------Start of value
-------- spoons
plastic white | steel brown
3.------End of value
2.----End Description
1.End Catergory

内容的提问来源于stack exchange,提问作者user8956060

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:39:37