我想从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
答案 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