禁用不适当的缓冲 Perl

  • 本文关键字:缓冲 Perl 不适当 perl
  • 更新时间 :
  • 英文 :


我正在使用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?文件句柄仍处于缓冲状态,但缓冲区会在每次printsay调用后自动刷新。

注意:autoflush 方法不适用于文件句柄还不是对象的真正古老的 perls。在这种情况下,请跳select舞:

my $old_fh = select $my_$fh;
$| = 1;
select $old_fh;
print { $my_fh } "this isn't buffered";

select返回当前选定的文件句柄)。

最新更新