Perl: запись нескольких заголовков в один документ YAML - PullRequest
0 голосов
/ 07 мая 2018

Ниже приведен желаемый выходной документ YAML.

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

Вот код, который я использую для создания документа YAML для сериализации.

sub make_tagobj_core_header {
 return ({
    core =>  {
     type => $tagobj_type,
     size => $tagobj_size,
     blob => $tagobj_blob,
     }
  });
}

sub make_tagobj_text_header {
    my @tagobj_text_lines;
    my ($lineno, $length, $offset);

    $offset = 0;
    while(my $line = <$object_fh>) {
        $lineno = $. - 1;
        $length = length($line);

        push @tagobj_text_lines, {
            offset => $offset,
            length => $length,
        };
        $offset += $length;
    }

    return ({
        text => {
                lines => [@tagobj_text_lines]
            }
        })
    } 
}

my @tagobj_header_table;
push @tagobj_header_table, make_tagobj_core_header;
push @tagobj_header_table, make_tagobj_text_header;

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

Вот вывод.

---
core:
  blob: build\content\objects\36d80951814b5f08c7ba34cd7a5459b4c212ee6200ce247ac2a13d24b2fc0d57
  size: 31
  type: blob/text
---
text:
  lines:
    - length: 1
      offset: 0
    - length: 5
      offset: 1
    - length: 7
      offset: 6
    - length: 13
      offset: 13
    - length: 1
      offset: 26

Где я ошибся? Я думаю, что мне нужен массив хэшей в качестве объекта верхнего уровня в YAML, но они печатаются как отдельные документы, разделенные знаком «---». Я хотел бы удалить это без взлома вывода YAML :: Dumper :: dump, поскольку у меня есть сценарий использования для нескольких идентично структурированных документов YAML в одном файле, что поддерживается спецификацией.

1 Ответ

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

Как вы, кажется, уже знаете,

a: b
c: d

получается путем сброса хэша, поэтому вы хотите, чтобы хэш был верхним уровнем вашего документа. Подтверждение концепции:

print YAML::Dumper->new->dump({
   core => {
      blob => 'build\\content\\objects\\36d80951814b5f08c7ba34cd7a5459b4c212ee6200ce247ac2a13d24b2fc0d57',
      size => 31,
      type => 'blob/text',
   },
   text => {
      lines => [
         { length =>  1, offset =>  0 },
         { length =>  5, offset =>  1 },
         { length =>  7, offset =>  6 },
         { length => 13, offset => 13 },
         { length =>  1, offset => 26 },
      ],
   },
});

Выход:

---
core:
  blob: build\content\objects\36d80951814b5f08c7ba34cd7a5459b4c212ee6200ce247ac2a13d24b2fc0d57
  size: 31
  type: blob/text
text:
  lines:
    - length: 1
      offset: 0
    - length: 5
      offset: 1
    - length: 7
      offset: 6
    - length: 13
      offset: 13
    - length: 1
      offset: 26

Так измени

my @tagobj_header_table;
push @tagobj_header_table, make_tagobj_core_header;
push @tagobj_header_table, make_tagobj_text_header;

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

до

my %doc = (
   %{ make_tagobj_core_header() },
   %{ make_tagobj_text_header() },
);

print YAML::Dumper->new->dump(\%doc);

хотя я думаю, что было бы лучше, если бы вы изменили сабвуферы, чтобы сработало следующее:

my %doc = (
   core => make_tagobj_core_header(),
   text => make_tagobj_text_header(),
);

print YAML::Dumper->new->dump(\%doc);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...