【问题标题】:How can I read from continuously updated file in Perl?如何从 Perl 中不断更新的文件中读取?
【发布时间】:2010-10-29 07:00:30
【问题描述】:

您好,我想通读一个文件,进入睡眠状态,然后检查是否有新记录写入该文件。如果是,我想处理记录,如果不是,就回去睡觉,稍后再检查(在一个永远循环中)。

我以为我可以做这样的事情,但是在它第一次读取文件之后,它似乎永远不会拾取添加到文件中的新记录。

open (LOG, "<log_file") or die ("could not open log_file");

for (;  ;)   
{  
  print "Record Number == $.\n";   

  while ($text=<LOG>)     
  {                       
    chomp ($text);
    print "$text\n";
  }
  sleep (60);

}

close (LOG);

最初读取文件后,上面的脚本只是不断打印文件中最后一条记录的记录号。 我看到一些关于可用的 TailFile 包的信息,但似乎我没有它,此时很难加载。我希望有一个普通的 perl 解决方案。

提前致谢。

【问题讨论】:

    标签: perl


    【解决方案1】:

    @jmanning2k,你有处理这个的链接吗? perl 食谱有以下内容,看起来很弱...

    为了 (;;) { 尽管 () { .... } 睡觉 $SOMETIME; 寻找(FH, 0, 1); }

    或 IO::Handle 模块的 clearerr 方法:

    使用 IO::Seekable;
    为了 (;;) {
         尽管 () { .... }
         睡觉 $SOMETIME;
         FH->clearerr();
     }

    【讨论】:

      【解决方案2】:

      Perl 常见问题解答对此进行了介绍。有关完整条目,请参阅perldoc -q tail。如果你愿意安装CPAN 模块,你应该考虑File::Tail

      【讨论】:

        【解决方案3】:

        这是因为当文件句柄返回 EOF 时,您的 while 循环将终止。您需要在阅读之前清除 EOF 标志。

        在while循环和睡眠之后使用seek。

        seek(LOG, 0, 1);
        

        字面意思是:从当前位置移动零字节。它不会在文件中前进,但会为下一次读取清除 EOF 条件。

        你也可以使用 IO::Handle 模块并调用 clearerr();

        use IO::Handle;
        # ...
        LOG->clearerr();
        

        最后,如果您愿意使用绑定的文件句柄,可以尝试 CPAN 上的 File::Tail 模块。

        【讨论】:

          【解决方案4】:

          File::Tail 是你的朋友。

          【讨论】:

            猜你喜欢
            • 2013-05-19
            • 2014-09-30
            • 2021-02-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-28
            • 1970-01-01
            相关资源
            最近更新 更多