我有一个从另一个来源生成的yaml文件,如下所示。
connect1:
connect2:
- { level1 : name, level2: age,
level3: gender}
我的代码看起来像这样-?
use YAML::Tiny qw(LoadFile);
use YAML;
use YAML::Loader;
use YAML::Syck;
use YAML qw(LoadFile);
use Data::Dumper;
my $data = LoadFile("file.yaml");
my @config = $data->{connect1}->{connect2};
print Dumper(@config);
我收到以下错误-> YAML错误:地图中的元素无效 代码:YAML_LOAD_ERR_BAD_MAP_ELEMENT 行:3 文件:1
如果level1,level2和leve3在同一行中,那么我看不到此问题。 我认为该问题是由于缩进造成的。 但是我无法更改此file.yaml。 那么在perl中有没有办法我仍然可以在不修改file.yaml的情况下解析该yaml文件?
答案 0 :(得分:6)
Perl中YAML的状态有点不幸,因为有几个模块支持不同的功能。
YAML :: Syck,YAML :: XS和YAML :: PP可以解析您的示例。 YAML :: XS现在可能是一个不错的选择。
YAML.pm是YAML的第一个perl模块,它是为YAML 1.0编写的。
YAML::Syck基于libsyck,它是为YAML 1.0编写的。它可以解析的内容比YAML.pm还要多。
YAML::XS基于libyaml,是针对YAML 1.1编写的。您应该能够使用它解析大多数YAML,并且libyaml用于(或已移植到)许多其他语言中。
YAML::Tiny仅支持YAML的子集,其中不包括流集合{ ... }
,[ ... ]
和别名/锚(&x
,*x
)< / p>
YAML::PP相当新,可以解析很多,但还没有完成。它旨在解析YAML 1.2(将来还将部分支持1.1)免责声明:我是作者
在这里您可以从2017年伦敦Perl研讨会上找到我的幻灯片: https://perlpunk.github.io/slides.lpw2017/yaml-where-and-how-to-use/
从幻灯片24开始,您将快速浏览5个模块。
答案 1 :(得分:2)