禁用不适当的缓冲Perl

时间:2013-12-29 12:33:49

标签: perl

我正在使用perl中的文件解析器,它打印它处理的每个文件的名称。但我注意到这些打印输出出现故障,引起了我的注意。在进一步挖掘之后,我发现这是因为,Perl正在使用缓冲并仅在缓冲区已满时将这些打印语句释放到输出。我还了解到 “使文件句柄变得热门” 。每当您打印到热文件句柄时,Perl立即刷新缓冲区。所以我的问题是:

“使文件句柄变热”会有什么后果吗?

在冲洗和冲洗之前是否让缓冲区充满会对性能产生任何影响?

1 个答案:

答案 0 :(得分:2)

Perl根据上下文使用不同的输出缓冲模式:写入文件等缓冲区块(这对性能很重要),如果perl有理由相信输出到终端,则在每行之后刷新句柄。 <{1}}默认情况下是无缓冲的。

您可以通过将特殊STDERR变量设置为true值来停用当前select ed文件句柄的缓冲。但是,这更好地表达为:

$|

的优点是您不必对use IO::File; # on older perls ... $some_file_handle->autoflush(1); print { $some_file_handle } "this isn't buffered"; 以外的句柄使用恼人的select函数。为什么这个方法叫STDOUT?文件句柄仍然是缓冲的,但在每次autoflushprint调用后,缓冲区会自动刷新。

小心:say方法不适用于文件句柄不是对象的真正古老的perls。在这种情况下,做autoflush舞蹈:

select

my $old_fh = select $my_$fh; $| = 1; select $old_fh; print { $my_fh } "this isn't buffered"; 返回当前选定的文件句柄。)