gpt4 book ai didi

perl - 如何将flock与yaml一起使用?

转载 作者:行者123 更新时间:2023-12-01 13:33:23 24 4
gpt4 key购买 nike

我想对 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;

最佳答案

请注意,根据其文档 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;

关于perl - 如何将flock与yaml一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6827858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com