我想从YAML文件中读取数据,但我需要保留元素的顺序.
perl中是否有一个具有此功能的模块以及如何执行此操作?
回应@mugen kenichi
我设法做了我想做的事,但我不相信这是一个合理的解决方案.
老YAML:
foo:
bar: some value
baz: other value
qwe:
bar: yet another value
baz: again
Run Code Online (Sandbox Code Playgroud)
新的YAML
-
foo:
bar: some value
baz: other value
-
qwe:
bar: yet another value
baz: again
Run Code Online (Sandbox Code Playgroud)
所述YAML SPEC特别指出的是"映射键没有一个订单",并且"在节点顺序为显著每一种情况下,一个序列必须使用".从映射推断订单将违反规范.正如mugen所提到的,使用有序映射是保持顺序的正确解决方案.
如果你真的想要,你可以以某种方式得到一个YAML解析器转储到一个Tie :: IxHash,这将保留顺序...但我知道没有Perl YAML解析器,它给你这个级别的控制.您可以使用YAML :: Old :: Loader执行某些操作,但这不是一个非常好的YAML解析器,并且没有记录YAML :: Old :: Loader.
第三个选项是使用显式YAML标记(也称为类型)来指示解析器将映射作为特殊类型加载,然后提供回调...但即使这样,YAML解析器也可能会为您的回调提供无序哈希值.
我建议你只需更改YAML.可移植数据语言的意义在于,所有语义含义在数据文件或规范中都是显式的,而不是特定解析器中隐含的.有序映射是一种公认的,紧凑的YAML习语.
- foo:
bar: some value
baz: other value
- qwe:
bar: yet another value
baz: again
Run Code Online (Sandbox Code Playgroud)