Как использовать Flock с YAML? - PullRequest
2 голосов
/ 26 июля 2011

Я хотел бы использовать блокировку файлов для файлов 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 ]

4 голосов
/ 26 июля 2011

Обратите внимание, что согласно документации 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;
2 голосов
/ 26 июля 2011

YAML :: Syck :: LoadFile принимает имя файла или объекта ввода-вывода: вы можете использовать, например, IO :: File :: flock .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...