gpt4 book ai didi

perl - 当有人写入文件时读取文件

转载 作者:行者123 更新时间:2023-12-03 01:26:08 24 4
gpt4 key购买 nike

脚本从文件中读取行,代码如下:

#!/usr/bin/perl
use strict;
use warnings;
use AnyEvent;

open my $fh, '<', 'input.txt' or die "Can't open file: $!";

my $cv = AE::cv;

my $timer = AE::timer 0, 10, sub {
printf "TELL: %s EOF: %s\n", tell $fh, eof $fh;
print while <$fh>;
};

$cv->recv;

如果我通过 cat 添加行,则脚本会读取新行。但是,如果我通过 vim 编辑器编辑文件,则脚本不会在文件中看到任何新行并发出 EOF。为什么脚本会这样并且看不到新行?

脚本的输出:

$ perl test.pl
TELL: 0 EOF:
row_1
row_2
row_3
TELL: 18 EOF: 1
TELL: 18 EOF: 1
TELL: 18 EOF:
row_4
TELL: 24 EOF:
row_5
TELL: 30 EOF: 1
TELL: 30 EOF: 1
TELL: 30 EOF: 1
TELL: 30 EOF: 1

input.txt的初始内容:

row_1
row_2
row_3

通过猫添加:

$ cat >> input.txt
row_4
row_5

通过 vim 添加:

$ vim input.txt
row_6
row_7

最佳答案

shell 的 >> 指令打开现有文件,而 vim 创建一个与旧文件同名的新文件,让你的程序读取一个 now-匿名文件。

$ touch a

$ perl -MFile::stat -e'my $qfn = $ARGV[0]; my $s = stat($qfn) or die $!; printf "%s:%s\n", $s->dev, $s->ino' a
2065:1084527165

$ cat >>a
foo

$ perl -MFile::stat -e'my $qfn = $ARGV[0]; my $s = stat($qfn) or die $!; printf "%s:%s\n", $s->dev, $s->ino' a
2065:1084527165

$ vim a

$ perl -MFile::stat -e'my $qfn = $ARGV[0]; my $s = stat($qfn) or die $!; printf "%s:%s\n", $s->dev, $s->ino' a
2065:1084520254

您需要重新打开该文件。

#!/usr/bin/perl
use strict;
use warnings;
use AnyEvent;
use Fcntl qw( SEEK_SET );

my $cv = AE::cv;

my $qfn = $ARGV[0];
my $last_pos = 0;

my $timer = AE::timer 0, 10, sub {
open(my $fh, '<', $qfn)
or die("Can't open file: $!\n");
seek($fh, $last_pos, SEEK_SET)
or die("Can't seek: $!\n");

printf "TELL: %s EOF: %s\n", tell $fh, eof $fh;

print while <$fh>;

( $last_pos = tell($fh) ) >= 0
or die("Can't tell: $!\n");
};

$cv->recv;

输出:

$ echo foo >a

$ perl a.pl a
TELL: 0 EOF:
foo
TELL: 4 EOF: 1
TELL: 4 EOF: 1 echo bar >>foo
TELL: 4 EOF:
bar
TELL: 8 EOF: 1
TELL: 8 EOF: 1 Used vim to change the file to "The quick brown fox"
TELL: 8 EOF:
k brown fox
TELL: 20 EOF: 1
^C

关于perl - 当有人写入文件时读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52264373/

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