在perl中解析yaml->代码:YAML_LOAD_ERR_BAD_MAP_ELEMENT

时间:2018-08-04 21:53:16

标签: perl parsing yaml

我有一个从另一个来源生成的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文件?

2 个答案:

答案 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)

看着cpan page

In exchange for this adding this extreme flexibility, it provides support 
for only a limited subset of YAML. But the subset supported contains most 
of the features for the more common uses of YAML.

所以我认为您可能需要尝试更完整的YAML解析器

如果您不愿意这样做,则可以研究命令行实用程序来进行解析,例如yq或另一个YAML到JSON的转换,并作为JSON处理。