Сериализация YAML-документа из структуры данных Perl - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь распечатать документ YAML из структуры данных, в частности, массива хешей, который, как я думаю, возвращает YAML :: dump. Вот код Perl, который я использую для создания документа YAML и его сериализации.

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): ~

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Используемая вами структура данных Perl не соответствует требуемым данным YAML. Только случайно он компилируется, и вы, должно быть, видели предупреждение

Нечетное количество элементов в анонимном хеше

когда вы выполняете свой код. Пожалуйста, не игнорируйте предупреждения, особенно когда обращаетесь за помощью к вашему коду

В YAML элемент lines является массивом, тогда как ваши данные Perl имеют его как хэш. Вам необходимо заменить скобки { ... } на квадратные скобки [...]

Я также советую вам избегать YAML::Dump, который является взломанным модулем YAML::Tiny. YAML::XS является предпочтительной Perl-реализацией YAML и является связующим звеном для превосходной libyaml библиотеки

0 голосов
/ 06 мая 2018

Это не проблема 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,
     }
     }
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...