如何使用yaml羊群?

时间:2011-07-26 09:19:18

标签: perl

我想在yaml文件上使用文件锁定,但是如何获取yaml文件的文件句柄?

#!/usr/bin/perl

use strict;
use YAML::Syck;
use Fcntl ':flock';

use warnings;

my $cfg = YAML::Syck::LoadFile('t.yaml');

# need a handle

flock($fh, LOCK_EX) or die "couldn't get lock: $!\n";

$cfg->{a} = 1;

close $fh;

更新

基于我现在尝试以下的答案,但它总是写一个空的无效yaml文件。

#!/usr/bin/perl
use strict;
use YAML::Syck;
use Fcntl ':flock';
use warnings;

open my $fh, ">t.yaml";

my $cfg = YAML::Syck::LoadFile($fh);

flock($fh, LOCK_EX) or die "couldn't get lock: $!\n";

$cfg->{a} = 1;

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

print $fh $yaml . "---\n";
close $fh;

2 个答案:

答案 0 :(得分:4)

请注意,根据其文档LoadFile也接受文件句柄。您可以先打开flock并将句柄传递给LoadFile

编辑:我会使用以下内容:

use strict; use warnings;
use YAML::Syck;
use Fcntl ':flock', 'SEEK_SET';

open my $fh, '+<', 't.yaml';
flock($fh, LOCK_EX) or die "couldn't get lock: $!\n";

my $cfg = YAML::Syck::LoadFile($fh);

$cfg->{a} = 1;
$cfg->{b} = 2;

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

seek $fh,0, SEEK_SET;   # seek back to the beginning of file
print $fh $yaml;
close $fh;

答案 1 :(得分:2)

YAML::Syck::LoadFile接受文件名 IO对象:您可以使用例如IO::File::flock