如何读取不断更新的文件?

jtk*_*jtk 14 perl

我从外部服务器获取数据流(文本格式),并希望逐行将其传递给脚本.该文件以连续方式附加.哪个是执行此操作的理想方法.使用Perl的IO :: Socket方法会做什么?最终,这些数据必须通过PHP程序(可重用)并最终登陆MySQL数据库.

问题是如何打开文件,不断更新?

mob*_*mob 24

在Perl中,您可以使用seek和tell读取不断增长的文件.它可能看起来像这样(从中大量借用perldoc -f seek)

open(FH,'<',$the_file) || handle_error();  # typical open call
for (;;) {
    while (<FH>) {
        # ... process $_ and do something with it ...
    }
    # eof reached on FH, but wait a second and maybe there will be more output
    sleep 1;
    seek FH, 0, 1;      # this clears the eof flag on FH
}
Run Code Online (Sandbox Code Playgroud)

  • 会有缓冲问题吗?应该修改`$ |`吗? (2认同)

mik*_*grb 9

在perl中有几个模块可以更轻松地拖尾文件. IO :: Tail和 File :: Tail使用回调,另一个使用阻塞读取,因此它取决于哪种更适合您的需求.可能还有其他拖尾模块,但这些是我想到的两个.

IO :: Tail - 跟随文件/流的尾部

 use IO::Tail;
 my $tail = IO::Tail->new();
 $tail->add('test.log', \&callback);
 $tail->check();
 $tail->loop();
Run Code Online (Sandbox Code Playgroud)

File :: Tail - 用于从不断更新的文件中读取的Perl扩展

use File::Tail;
my $file = File::Tail->new("/some/log/file");
while (defined(my $line= $file->read)) {
    print $line;
}
Run Code Online (Sandbox Code Playgroud)

  • IO :: Tail的回调子中有什么? (2认同)

Ale*_*lds 2

也许命名管道可以帮助您?

  • 你可以说得更详细点吗? (2认同)