如果我打印 $_,为什么 perl 允许从进程文件句柄中实时读取?

Why does perl allow reading in real time from a process filehandle if I print $_?

我正在编写一个捕获另一个程序输出的 perl 程序,我注意到在 while <FILEHANDLE> 循环中(因此 $_ 包含读取的行),发生以下情况:

open XIN, "-|", "test_xsr"; # not getting in real time! FIX
while (<XIN>) {
    print ".";
}

打印

....

程序完成后 while

open XIN, "-|", "test_xsr"; # not getting in real time! FIX
while (<XIN>) {
    print $_;
}

打印

1
2
3
done

实时程序运行。 (在我测试时,程序 总是 产生那个输出。)

为什么会出现这种不一致?
是否可以在没有printing$_的情况下实时处理输出?

默认情况下,如果 STDOUT 连接到终端,则只有在遇到换行符或缓冲区已满时才会刷新 STDOUT。有一个换行符导致缓冲区在您的第二个代码段中被刷新,但在您的第一个代码段中没有。

print之后添加以下内容以强制刷新输出:

STDOUT->flush();

将以下内容添加到程序中以在写入 STDOUT 后始终刷新:

STDOUT->autoflush();

(旧版本的 Perl 需要 use IO::Handle qw( ); 才能使用这些。)