【问题标题】:Perl YAML::Load fails to load YAML dumped by YAML::DumpPerl YAML::Load 无法加载 YAML::Dump 转储的 YAML
【发布时间】:2017-02-22 16:23:52
【问题描述】:

通过 perl 使用时,我在 YAML 中遇到了这个问题。谁能告诉我哪里出错了。

我有一个代码 sn-p

use YAML;
...
my $ifdef_struct = YAML::Load(<<'DS_TEMPLATE');
---
'<define_name>': undef
DS_TEMPLATE
my @tmp;
push(@tmp, $ifdef_struct);
$ifdef_struct = \@tmp; 
print YAML::Dump($ifdef_struct);    

这转储了

    ---
    - '<define_name>': undef

现在,当我将代码更改为与 YAML::Dump 转储的格式相同时

use YAML;
...
my $ifdef_struct = YAML::Load(<<'DS_TEMPLATE');
---
- '<define_name>': undef
DS_TEMPLATE
my @tmp;
push(@tmp, $ifdef_struct);
# $ifdef_struct = \@tmp;
print YAML::Dump($ifdef_struct);      

它无法加载它并给我错误

Uncaught exception from user code:
    YAML Error: Couldn't parse single line value
       Code: YAML_PARSE_ERR_SINGLE_LINE
       Line: 2
       Document: 1

欢迎提出任何建议。

【问题讨论】:

    标签: perl yaml


    【解决方案1】:

    YAML(模块)期望的格式是:

    ---
    -
        '<define_name>': undef
    

    然而,

    ---
    - '<define_name>': undef
    

    是有效的 YAML(格式)。如果您阅读YAML 的文档,您会发现以下警告:

    如果您想要使用正常的 Dump/Load 进行稳健且快速的 YAML 处理 API,请考虑切换到 YAML::XS。它是迄今为止最好的 Perl 此时 YAML 的模块。它要求你有一个 C 编译器, 因为它是用 C 编写的。

    YAML::XS 对任一版本的 YAML 都没有问题:

    #!/usr/bin/perl
    
    use strict;
    use YAML::XS;
    use Data::Dumper;
    use warnings;
    
    my $one_line = YAML::XS::Load(<<'EOS');
    ---
    - '<define_name>': undef
    EOS
    
    my $multi_line = YAML::XS::Load(<<'EOS');
    ---
    -
       '<define_name>': undef
    EOS
    
    print Dumper($one_line, $multi_line);
    

    输出:

    $VAR1 = [
              {
                '<define_name>' => 'undef'
              }
            ];
    $VAR2 = [
              {
                '<define_name>' => 'undef'
              }
            ];
    

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2017-11-25
      • 1970-01-01
      • 2014-10-27
      相关资源
      最近更新 更多