如果我打印 $_,为什么 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
实时而程序运行。 (在我测试时,程序 总是 产生那个输出。)
为什么会出现这种不一致?
是否可以在没有print
ing$_
的情况下实时处理输出?
默认情况下,如果 STDOUT 连接到终端,则只有在遇到换行符或缓冲区已满时才会刷新 STDOUT。有一个换行符导致缓冲区在您的第二个代码段中被刷新,但在您的第一个代码段中没有。
在print
之后添加以下内容以强制刷新输出:
STDOUT->flush();
将以下内容添加到程序中以在写入 STDOUT 后始终刷新:
STDOUT->autoflush();
(旧版本的 Perl 需要 use IO::Handle qw( );
才能使用这些。)
我正在编写一个捕获另一个程序输出的 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
实时而程序运行。 (在我测试时,程序 总是 产生那个输出。)
为什么会出现这种不一致?
是否可以在没有print
ing$_
的情况下实时处理输出?
默认情况下,如果 STDOUT 连接到终端,则只有在遇到换行符或缓冲区已满时才会刷新 STDOUT。有一个换行符导致缓冲区在您的第二个代码段中被刷新,但在您的第一个代码段中没有。
在print
之后添加以下内容以强制刷新输出:
STDOUT->flush();
将以下内容添加到程序中以在写入 STDOUT 后始终刷新:
STDOUT->autoflush();
(旧版本的 Perl 需要 use IO::Handle qw( );
才能使用这些。)