首页 > 解决方案 > 在 perl 中解析 yaml --> 代码:YAML_LOAD_ERR_BAD_MAP_ELEMENT

问题描述

我有一个 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 文件?

标签: perlparsingyaml

解决方案


Perl 中 YAML 的状态有点令人遗憾,因为有几个模块支持不同的功能。

YAML::Syck、YAML::XS 和 YAML::PP 可以解析您的示例。YAML::XS 现在可能是一个不错的选择。

YAML.pm是 YAML 的第一个 perl 模块,它是为 YAML 1.0 编写的。

YAML::Syck基于为 YAML 1.0 编写的 libsyck。它可以解析的不仅仅是 YAML.pm。

YAML::XS基于为 YAML 1.1 编写的 libyaml。您应该能够用它解析大多数 YAML,并且 libyaml 用于(或被移植到)许多其他语言。

YAML::Tiny只支持 YAML 的一个子集,它不包括流集合{ ... }[ ... ]别名/锚 ( &x, *x)

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

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

从幻灯片 24 开始,您会发现 5 个模块的快速概览。


推荐阅读