我正在使用perl中的文件解析器,该解析器打印它处理的每个文件的名称。但我注意到这些打印输出出现顺序不正常,这引起了我的注意。经过进一步挖掘,我发现这是因为 Perl 正在使用缓冲,并且仅在缓冲区已满时才将这些打印语句释放到输出中。我还了解到,通过"使文件句柄变热"有一个解决方法。每当你打印到热文件句柄时,Perl 会立即刷新缓冲区。所以我的问题是:
"使文件句柄变热"有什么后果吗?
在刷新与立即刷新之前让缓冲区填满对性能有影响吗?
Perl 根据上下文使用不同的输出缓冲模式:以块的形式写入文件等缓冲区(这对性能很重要),而如果 perl 有理由相信输出会转到终端,则在每行之后刷新句柄。 默认情况下,STDERR
是无缓冲的。
您可以通过将特殊 $|
变量设置为 true 值来停用当前select
ed 文件句柄的缓冲。但是,这最好表示为:
use IO::File; # on older perls
...
$some_file_handle->autoflush(1);
print { $some_file_handle } "this isn't buffered";
这样做的好处是您不必对STDOUT
以外的句柄使用烦人的select
功能。为什么这种方法叫autoflush
?文件句柄仍处于缓冲状态,但缓冲区会在每次print
或say
调用后自动刷新。
注意:autoflush
方法不适用于文件句柄还不是对象的真正古老的 perls。在这种情况下,请跳select
舞:
my $old_fh = select $my_$fh;
$| = 1;
select $old_fh;
print { $my_fh } "this isn't buffered";
(select
返回当前选定的文件句柄)。