我正在使用perl中的文件解析器,它打印它处理的每个文件的名称。但我注意到这些打印输出出现故障,引起了我的注意。在进一步挖掘之后,我发现这是因为,Perl正在使用缓冲并仅在缓冲区已满时将这些打印语句释放到输出。我还了解到 “使文件句柄变得热门” 。每当您打印到热文件句柄时,Perl立即刷新缓冲区。所以我的问题是:
“使文件句柄变热”会有什么后果吗?
在冲洗和冲洗之前是否让缓冲区充满会对性能产生任何影响?
答案 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
?文件句柄仍然是缓冲的,但在每次autoflush
或print
调用后,缓冲区会自动刷新。
小心:say
方法不适用于文件句柄不是对象的真正古老的perls。在这种情况下,做autoflush
舞蹈:
select
(my $old_fh = select $my_$fh;
$| = 1;
select $old_fh;
print { $my_fh } "this isn't buffered";
返回当前选定的文件句柄。)