请教一个用tail -f 作为管道输入的问题

请教一个用tail -f 作为管道输入的问题

要用perl实现如下功能
实时跟踪某一日志文件, 当文件中有符合标准的纪录出现, 将其按照固定格式转化成容易阅读的方式打印在屏幕上

当我用"tail -f $filename |"作为管道的输入时, 发现并不是所有符合标准的纪录都会被打印出来, 尤其是有连续多条符合标准的纪录同时出现时

以下是程序的简化版, 猜测是tail -f 的缓存的问题, 但没有头绪如何解决, 求高手指点,谢谢
#!/usr/bin/perl -w
use strict;
sub print_bps($)
{
    my $filename=shift;
    open(PHANDLE,"tail -f $filename |" ||die "Can not open pipe for reading:!$\n";
        while(<HANDLE>
        {
            my $bps_log=<HANDLE>;
            if($bps_log=~/TCHMQTransport\:\sReceived\sUpStream\stransport\sMQ\sMessage\s\=DATA/)
            {
                my @BPS_tmp=split(/=/,$bps_log);
                my $len=$BPS_tmp[1];
             chomp($len);
            if(length($len)==2060)
            {
                print "$len\n";
            }
       elsif(length($len)==2260)
       {
                print "$len\n";
            }
   }
  }
   close(PHANDLE)||warn "pipe to more failed: !$\n";
       
}

if($#ARGV!=0)
{
   die ("Usage: parse_bps.pl filename\n e.g parse_bps.pl BPS.log\n";
}

else
{
   print_bps($ARGV[0]);

}
如果不是一定要用tail -f的话, File::Tail应该是没问题的.
搞定了

把所有的变量都打印出来,
发现如果my $bps_log=<PHANDLE>;
处理是读一行跳过一行, 因此会丢掉一些纪录

把值设置成my $bps_log=$_; 就可以了

但是还是不是很理解为什么是这么处理, 继续请高手指教
在while的条件里<PHANDLE>读了一行,再用my $bps_log=<PHANDLE>;又读了一行,当然会读一行跳过一行了。
收到了.. 多谢~~