Как записать исходный файл YAML?

#perl #hash #yaml

#perl #хэш #yaml

Вопрос:

У меня есть хэш %h , который я хотел бы сохранить как YAML.

 #!/usr/bin/perl

use warnings;
use strict;

my %h = ();

# -----

use YAML::Syck;
my $y = YAML::Syck::LoadFile('have_seen.yaml');

$y->%h ???

my $yaml = YAML::Syck::Dump($y);
$yaml::Syck::ImplicitUnicode = 1;

open F, ">have_seen.yaml" or die $!;
print F $yaml . "---n";
close F;
  

Но это похоже на проблему с курицей и яйцом.

Как мне записать файл yaml в первый раз, чтобы его можно было прочитать?

Обновление: на основе принятого ответа было найдено решение

 #!/usr/bin/perl

use warnings;
use strict;
use YAML::Syck;
use Data::Dumper;

my $first_time = 1;

if ($first_time) {

    my %h = ("1" => 2);

    open F, '>', 'seen.yaml';
    print F YAML::Syck::Dump(%h);
    close F;

} else {

    my $h = YAML::Syck::LoadFile('seen.yaml');

    $h->{"3"} = 4;

    print Dumper $h;

    my $yaml = YAML::Syck::Dump($h);
    $yaml::Syck::ImplicitUnicode = 1;

    open F, ">seen.yaml" or die $!;
    print F $yaml . "---n";
    close F;
}
  

Ответ №1:

Используйте DumpFile , и установите YAML::XS. YAML::Syck, насколько я знаю, считается устаревшим / неподдерживаемым.

 ~>perl -MYAML=DumpFile -le 'DumpFile("test.yml", { o => "hai" })'
~>cat test.yml
---
o: hai
  

Комментарии:

1. Довольно сложно дать окончательный ответ, какой модуль YAML вам подходит. Я выбираю YAML::Syck , потому что он был самым простым. Если вы обнаружите, что он устарел, пожалуйста, дайте мне знать, и я изменю.

Ответ №2:

Используйте Dump для преобразования произвольного объекта в строку в кодировке YAML, затем распечатайте эту строку в файл.

 $h{foo} = "bar";
$h{"answer to life, the universe, and everything"} = 42;

open F, '>', 'have_seen.yaml';
print F YAML::Syck::Dump( %h );
close F;
  

Комментарии:

1. Хорошо. Какие изменения я затем должен внести в свой существующий код? Обычно я бы использовал $h{foo} для получения bar .

Ответ №3:

 #!/usr/bin/perl
use warnings;
use strict;

use YAML::Any qw'DumpFile LoadFile';

my $data_filename = 'seen.yaml';

my $data = LoadFile( $data_filename );

unless( $data ){
  # first time
  $data = {
    1 => 2
  };
}

$data->{3} = 4;

DumpFile( $data_filename, $h );