通过我上一个问题的讨论,我了解到 Perl 默认提供行缓冲区输出。
$| = 0; # for buffered output (by default)
如果您想获得无缓冲的输出,则将特殊变量设置$|
为 1 即
$| = 1; # for unbuffered output
现在我想知道在哪些情况下应该更喜欢无缓冲的输出?
通过我上一个问题的讨论,我了解到 Perl 默认提供行缓冲区输出。
$| = 0; # for buffered output (by default)
如果您想获得无缓冲的输出,则将特殊变量设置$|
为 1 即
$| = 1; # for unbuffered output
现在我想知道在哪些情况下应该更喜欢无缓冲的输出?
您需要交互式任务的无缓冲输出。我的意思是,当您期望某人或某物响应输出时,您不希望输出卡在某个缓冲区中。
例如,您不希望发送到 STDOUT 的用户提示被缓冲。(这就是为什么 STDOUT 在连接到终端时永远不会完全缓冲的原因。它只是行缓冲,并且通过尝试从 STDIN 读取来刷新缓冲区。)
例如,您希望通过管道和套接字发送的请求不会卡在某个缓冲区中,因为连接的另一端永远看不到它。
我能想到的唯一另一个原因是,当您不希望在发生不可恢复的错误(例如恐慌或信号死亡)时将重要数据卡在缓冲区中。
例如,您可能希望保持日志文件不受缓冲,以便能够诊断严重问题。(这就是默认情况下不缓冲 STDERR 的原因。)
下面是一小部分来自 StackOverflow 的 Perl 用户,他们从学习 set 中受益$| = 1
:
为什么添加或删除换行符会改变 perl for 循环函数的方式?
在 Perl 中,如何在输入到达后立即处理,而不是等待换行符?
保持输出流与屏幕上显示的完全相同(使用交互式数据时)的简单方法是什么?
当通过套接字或管道写入另一个程序时,它会很有用。当您将调试信息写入 STDOUT 以实时查看程序状态时,它也很有用。