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

如何读取Perl中不断更新的文件?,perl,Perl,您好,我想通读一个文件,进入睡眠状态,然后检查是否有新记录写入该文件。如果是,我想处理记录,如果不是,回到睡眠状态,稍后再检查(在一个永久循环中) 我以为我可以做这样的事情,但是在它第一次读取文件之后,它似乎从来没有拾取添加到文件中的新记录 open (LOG, "<log_file") or die ("could not open log_file"); for (; ;) { print "Record Number == $.\n"; while ($

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

我以为我可以做这样的事情,但是在它第一次读取文件之后,它似乎从来没有拾取添加到文件中的新记录

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);

open(LOG),是您的朋友。

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

在while循环和sleep之后使用seek

seek(LOG, 0, 1);
字面意思是:从当前位置移动零字节。它不会在文件中前进,但会清除下一次读取的EOF条件

您还可以使用IO::Handle模块并调用clearerr()


最后,如果你愿意使用一个绑定的文件句柄,在CPAN上有一个文件::/TP>你可以尝试。

< P>这是Perl FAQ所涵盖的。请参阅完整的条目。如果你愿意安装一个模块,你应该考虑。

@ JMANNY2K,你是否有一个链接来处理这个?Perl食谱有如下内容,这看起来是很弱。。。 for (;;) { while () { .... } sleep $SOMETIME; seek(FH, 0, 1); } 对于(;;){ while(){…} 找个时间睡一觉; 寻道(FH,0,1); }

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

use IO::Seekable; for (;;) { while () { .... } sleep $SOMETIME; FH->clearerr(); } 使用IO::Seekable; 对于(;;){ while(){…} 找个时间睡一觉; FH->clearerr(); } use IO::Seekable; for (;;) { while () { .... } sleep $SOMETIME; FH->clearerr(); }