0

以下のスクリプトを実行すると、

Can't use an undefined value as a symbol reference at ./yaml-test.pl line 52.

52行目はどこですか

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

スクリプトの目的は、破損した yaml ファイルを取得する理由を再現することです。そのため、グローバル ファイル ハンドルがそこにあると想定されます。

私の理論では、新しく書き込まれた yaml ファイルは上書きされないため、新しく書き込まれた yaml が古いものよりも小さい場合、古いデータは新しい yaml ファイルに残ります。

質問

私のスクリプトの何が問題なのか誰にもわかりますか?

#!/usr/bin/perl

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

my $acc;
my $acc_fh;

$acc->{1}{name1} = "abc";


system("rm -f test.yaml");

# write initial
open F, '>', 'test.yaml';
print F YAML::Syck::Dump($acc);
close F;


$acc->{1}{name2} = "abc";

write_yaml_with_lock($acc, $acc_fh);

$acc->{1}{name3} = "abc";

($acc, $acc_fh) = read_yaml_with_lock('test.yaml');

$acc->{1}{name4} = "abc";

write_yaml_with_lock($acc, $acc_fh);



sub read_yaml_with_lock {
    my ($file) = @_;

    open my $fh, '+<', $file or die $!;
    flock($fh, LOCK_EX) or die $!;

    my $obj = YAML::Syck::LoadFile($fh); # this dies on failure
    return ($obj, $fh);
}

sub write_yaml_with_lock {
    my ($obj, $fh) = @_;

    my $yaml = YAML::Syck::Dump($obj);
    $YAML::Syck::ImplicitUnicode = 1;
    seek $fh, 0, SEEK_SET;   # seek back to the beginning of file

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

1 に答える 1

2

write_yaml_with_lock()あなたは2回電話します。最初に呼び出すの$acc_fhundef、 を介してさらに 2 行下まで設定されないためread_yaml_with_lock()です。

于 2012-09-05T13:43:29.617 に答える