Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是等待文件更新然后用Perl从中读取的好方法?_Perl - Fatal编程技术网

什么是等待文件更新然后用Perl从中读取的好方法?

什么是等待文件更新然后用Perl从中读取的好方法?,perl,Perl,我想知道是否有一种方法可以等待文件被更新,然后在更新后从中读取。因此,如果我有file.txt,我想等到有新的东西写入它,然后再读取/处理它/等等。目前我正在使用Time::HiRes::sleep(.01)进行轮询,但我想知道是否有更好的方法。谢谢。是的,有更好的办法。在windows上可以使用该界面,在Linux上可以使用 窗户 LINUX 将轮询文件,但与您的方法相比有一些优势: 根据自上次轮询以来写入的行数动态重新计算轮询时间 如果文件保持不变,轮询将变慢,以避免耗尽CPU 文件::T

我想知道是否有一种方法可以等待文件被更新,然后在更新后从中读取。因此,如果我有
file.txt
,我想等到有新的东西写入它,然后再读取/处理它/等等。目前我正在使用
Time::HiRes::sleep(.01)
进行轮询,但我想知道是否有更好的方法。谢谢。

是的,有更好的办法。在windows上可以使用该界面,在Linux上可以使用

窗户

LINUX

将轮询文件,但与您的方法相比有一些优势:

  • 根据自上次轮询以来写入的行数动态重新计算轮询时间
  • 如果文件保持不变,轮询将变慢,以避免耗尽CPU
  • 文件::Tail将检测文件是否被截断、移动和/或重新创建,并以静默方式为您重新打开文件
  • 它可以绑定一个常规文件句柄,您可以像普通文件一样使用它,而无需任何特殊的API或语法
来自perldoc的示例:

use File::Tail;
my $ref=tie *FH,"File::Tail",(name=>$name);
while (<FH>) {
    print "$_";
}
使用File::Tail;
my$ref=tie*FH,“File::Tail”,(name=>$name);
而(){
打印“$”;
}
并且可以在inotify不支持的文件系统和Unix上工作。
use Linux::Inotify2;
my $inotify = new Linux::Inotify2();

foreach (@ARGV)
{
  $inotify->watch($_, IN_ALL_EVENTS);
}

while (1)
{
  # By default this will block until something is read
  my @events = $inotify->read();
  if (scalar(@events)==0)
  {
    print "read error: $!";
    last;
  }

  foreach (@events)
  {
    printf "File: %s; Mask: %d\n", $_->fullname, $_->mask;
  }
}
use File::Tail;
my $ref=tie *FH,"File::Tail",(name=>$name);
while (<FH>) {
    print "$_";
}