用Perl解析YAML --> 代码:YAML_LOAD_ERR_BAD_MAP_ELEMENT

4
我有一个从其他来源生成的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
YAML::XS 可以毫无问题地加载文件,YAML::PP 也是如此。 - choroba
4
有点混乱,因为你加载了几个YAML模块。实际上,您正在使用YAML.pmLoadFileYAML.pm不支持任何多行流样式,包括普通和带引号的字符串以及流样式集合{ ... }[ ... ]。它可能永远都不会支持。 - tinita
2个回答

7
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

YAML::PP相当新,已经可以解析很多内容,但还不完整。它旨在解析 YAML 1.2(未来还将部分支持 1.1)。免责声明:我是作者。

您可以在这里找到我在伦敦 Perl Workshop 2017 上的幻灯片: https://perlpunk.github.io/slides.lpw2017/yaml-where-and-how-to-use/

从第24页开始,您将找到5个模块的快速概述。


2
查看 cpan页面
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处理的工具。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接