Perl YAML模块中的别名解析错误?
我正在尝试使用Perl加载一个“简单”YAML文件:Perl YAML模块中的别名解析错误?,perl,yaml,Perl,Yaml,我正在尝试使用Perl加载一个“简单”YAML文件: foo: &baz dog: cat cat: rat bar: <<: *baz rat: cheese foo:&baz 狗:猫 猫:老鼠 酒吧: YAML和YAML::Syck不支持是合乎逻辑的,因为这些解析器实现了YAML 1.0,并且该扩展是为YAML 1.1提出的 该扩展不是YAML 1.1规范的一部分,例如,YAML::XS所基于的libyaml本身不支持它。Ruby、Python和Java
foo: &baz
dog: cat
cat: rat
bar:
<<: *baz
rat: cheese
foo:&baz
狗:猫
猫:老鼠
酒吧:
YAML和YAML::Syck不支持是合乎逻辑的,因为这些解析器实现了YAML 1.0,并且该扩展是为YAML 1.1提出的
该扩展不是YAML 1.1规范的一部分,例如,YAML::XS所基于的libyaml本身不支持它。Ruby、Python和JavaScrip YAML解析器在libyaml库的顶部实现合并,这是YAML::XS似乎没有做到的
正如@bart所评论的,加载后遍历树有一些变通方法:因此基本上我必须分叉这些模块中的一个,并插入解析别名的代码(这似乎是YAML 1.2的一部分?不能说我对阅读语言规范很熟悉),例如:如果您确实从基于libyaml的YAML::XS开始。或者,您可以使用支持合并的解析器对文件进行预处理,方法是读入文件并将其写回。除了我的ruamel.yaml Python解析器在往返时保留合并外,所有其他解析器都将“取消合并”映射,然后您可以使用这些库将其读入Perl中。@bart我可以用它扩展我的答案吗,或者您想自己将其作为答案发布吗?@Anthon当然,您可以扩展您的答案;)
{
'foo' => {
'cat' => 'rat',
'dog' => 'cat'
},
'bar' => {
'rat' => 'cheese',
'<<' => $VAR1->{'foo'}
}
}