【问题标题】:Serialize YAML document from Perl data structure从 Perl 数据结构序列化 YAML 文档
【发布时间】:2018-05-06 02:44:05
【问题描述】:

我正在尝试从数据结构中打印出 YAML 文档,特别是哈希数组,我认为这是 YAML::dump 返回的内容。这是我用来构建 YAML 文档并对其进行序列化的 Perl 代码。

my @tagobj_header_table =
{
core => {
    type => $tagobj_type,
    size => $tagobj_size,
    blob => $tagobj_blob,
},
text => {
     lines => {
     {
         offset => 0,
         length => 1
     },
     {
         offset => 1,
         length => 5,
     },
     {
         offset => 6,
         length => 7,
     },
     {
         offset => 13,
         length => 13,
     },
     {
         offset => 26,
         length => 1,
     }
     }
  }
};

my $dumper = YAML::Dumper->new;
my $tagobj_contents = $dumper->dump(@tagobj_header_table);
print $tagobj_contents;

这就是我希望 YAML 文档的样子,其中包含一些 Perl 字符串替换。

---
core:
    type: $tagobj_type
    size: $tagobj_size
    blob: $tagobj_blob
text:
    lines:
        - offset: 0
          length: 1
        - offset: 1
          length: 5
        - offset: 6
          length: 7
        - offset: 13
          length: 13
        - offset: 26
          length: 1

以下是控制台的输出。

---
core:
    blob: build\content\objects\36d80951814b5f08c7ba34cd7a5459b4c212ee6200ce247ac2a13d24b2fc0d57
    size: 31
    type: blob/text
text:
    lines:
        HASH(0x4d1b840):
            length: 13
            offset: 13
        HASH(0x4d1df38):
            length: 5
            offset: 1
        HASH(0x4d1eee8): ~

【问题讨论】:

  • .text.lines 是您数据结构中的哈希 ({}),但键是什么?价值观是什么?您显然想要一个数组 ([])。
  • 让它成为一个答案,这样我就可以接受它@mwp

标签: perl yaml


【解决方案1】:

您使用的 Perl 数据结构与您需要的 YAML 数据不对应。它完全编译只是偶然,你一定看到了警告

匿名哈希中的奇数个元素

当你执行你的代码时。请不要忽略警告,尤其是在寻求代码帮助时

在 YAML 中,lines 元素是一个数组,而您的 Perl 数据将它作为散列。您需要将大括号{ ... } 替换为方括号[...]

我还建议您避免使用 YAML::Dump,它是对 YAML::Tiny 模块的一种微不足道的破解。 YAML::XS 是 YAML 的首选 Perl 实现,是优秀的 libyaml 库的绑定

【讨论】:

    【解决方案2】:

    这不是 YAML 问题; lines 应该映射到 arrayref,而不是 hashref:

    text => {
         lines => { # this is an hashref, so
         {
             offset => 0,
             length => 1
         }, # this is a hash key, and gets stringified: "HASH(0x4d1df38)"
         {
             offset => 1,
             length => 5,
         }, # and this is a hash value
         {
             offset => 6,
             length => 7,
         }, # this is a key, also stringified: "HASH(0x4d1b840)"
         {
             offset => 13,
             length => 13,
         }, # and this is a value...
         {
             offset => 26,
             length => 1,
         }
         }
      }
    };
    

    【讨论】:

      猜你喜欢
      • 2016-02-19
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 2020-09-17
      相关资源
      最近更新 更多