Как написать исходный файл YAML? - PullRequest
2 голосов
/ 26 апреля 2011

У меня есть хеш %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;
}

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

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

~>perl -MYAML=DumpFile -le 'DumpFile("test.yml", { o => "hai" })'
~>cat test.yml
---
o: hai
2 голосов
/ 26 апреля 2011

Используйте 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;
0 голосов
/ 26 апреля 2011
#!/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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...