保留YAML订单perl

时间:2011-08-24 07:47:12

标签: perl module yaml

我想从YAML文件中读取数据,但我需要保留元素的顺序。
在perl中是否有一个具有此功能的模块以及如何操作?


回应@mugen kenichi

我设法做了我想做的事,但我不相信这是一个合理的解决方案。

老YAML:

foo:
   bar: some value
   baz: other value
qwe:
   bar: yet another value
   baz: again

新YAML

 -
   foo:
      bar: some value
      baz: other value
 -  
   qwe:
      bar: yet another value
      baz: again

1 个答案:

答案 0 :(得分:6)

“映射键没有顺序”的YAML spec specifically states以及“在每种情况下节点顺序都很重要,必须使用序列”。从映射推断订单将违反规范。如mugen所述,使用有序映射是保持顺序的正确解决方案。

如果真的想要,你可以以某种方式获得一个YAML解析器转储到Tie::IxHash这将保留顺序...但我知道没有Perl YAML解析器给你那种控制水平。您可以使用YAML::Old::Loader执行某些操作,但这不是一个非常好的YAML解析器,并且没有记录YAML :: Old :: Loader。

第三种选择是使用显式YAML tags(又称类型)来指示解析器将映射作为特殊类型加载,然后提供回调......但即使这样,YAML解析器也可能会使用无序散列提供回调。

我建议你只需更改YAML。可移植数据语言的意义在于,所有语义含义在数据文件或规范中都是显式的,而不是特定解析器中隐含的。有序映射是一种公认​​的,紧凑的YAML习语。

- foo:
      bar: some value
      baz: other value
- qwe:
      bar: yet another value
      baz: again