#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 );