我想在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;
答案 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。