Perl YAML :: Load无法加载YAML :: Dump转储的YAML

jus*_*eep 2 perl yaml

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

我有一个代码段

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);    
Run Code Online (Sandbox Code Playgroud)

抛弃了

    ---
    - '<define_name>': undef
Run Code Online (Sandbox Code Playgroud)

现在,当我将代码更改为具有与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);      
Run Code Online (Sandbox Code Playgroud)

它无法加载它并给我错误

Uncaught exception from user code:
    YAML Error: Couldn't parse single line value
       Code: YAML_PARSE_ERR_SINGLE_LINE
       Line: 2
       Document: 1
Run Code Online (Sandbox Code Playgroud)

欢迎任何建议.

Cha*_*ens 5

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

---
-
    '<define_name>': undef
Run Code Online (Sandbox Code Playgroud)

然而,

---
- '<define_name>': undef
Run Code Online (Sandbox Code Playgroud)

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

如果您想使用常规转储/加载API进行稳健快速的YAML处理,请考虑切换到YAML :: XS.它是目前YAML最好的Perl模块.它要求你有一个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);
Run Code Online (Sandbox Code Playgroud)

输出:

$VAR1 = [
          {
            '<define_name>' => 'undef'
          }
        ];
$VAR2 = [
          {
            '<define_name>' => 'undef'
          }
        ];
Run Code Online (Sandbox Code Playgroud)