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

时间:2016-10-13 13:45:12

标签: 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);    

这会转出

    ---
    - '<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

欢迎任何建议。

1 个答案:

答案 0 :(得分:5)

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

---
-
    '<define_name>': undef

然而,

---
- '<define_name>': undef

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

  

如果您希望使用正常的转储/加载进行强大而快速的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'
          }
        ];