253: my $sel = select(FOUT);
254: $| = 1; # for DB::OUT
255: select($sel);
在Term::ReadLine
模块中发现,看起来很奇怪。
答案 0 :(得分:8)
写入STDOUT(或任何其他输出文件句柄)由缓冲 默认。要求Perl在每次写入或打印后立即刷新 命令,设置特殊变量$ |到1。
http://www.perlhowto.com/disable_output_buffering
编辑以获得进一步说明:
my $sel = select(FOUT);
FOUT
是一个文件句柄,使用select
使其成为default file handle
,因此使用default file handle
的任何操作现在都会使用FOUT
。例如,print "moo"
将等同于print FOUT "moo"
。
select
的返回值是之前的default file handle
,即标准输出。
$| = 1;
此命令禁用default file handle
上的输出缓冲,因为句柄FOUT
禁用FOUT
的输出缓冲。
select($sel);
现在我们带回前一个default file handle
,即标准输出,因此print
命令等按预期工作。
编辑#2:文件句柄的进一步说明:
想象一下,您有一系列文件句柄,STDOUT
,FILE_ONE
,FILE_TWO
,SOCKET_ONE
和SOCKET_TWO
。您希望将FILE_ONE
和SOCKET_TWO
设置为无输出缓冲。
# On startup Perl effectively does the following:
# select(STDOUT);
my $sel = select(FILE_ONE);
# $sel is now STDOUT
$| = 1;
select(SOCKET_TWO);
$| = 1;
# bring back STDOUT
select($sel);
现在让我们发现神奇的default file handle
会发生什么。
print "HELLO\n";
# equivalent to: print STDOUT "HELLO\n";
my $sel = select(FILE_ONE);
# sets `default file handle` to FILE_ONE
print "HELLO\n";
# equivalent to: print FILE_ONE "HELLO\n";
$| = 1;
# disables output buffering on handle FILE_ONE
select(SOCKET_TWO)
# sets `default file handle` to SOCKET_TWO
print "HELLO\n";
# equivalent to: print SOCKET_TWO "HELLO\n";
$| = 1;
# disables output buffering on handle SOCKET+TWO
select($sel);
# sets `default file handle` to STDOUT
或者让我们发明一些新变量:
$FH
# let this be the `default file handle`
让我们发明一个新功能:
sub disable_output_buffer ($file_handle) {
# magic occurs here
}
现在让我们使用这个新的文件句柄和函数重写前面的代码。
# print "HELLO\n";
my $FH = STDOUT;
print $FH "HELLO\n" # print STDOUT "HELLO\n"
# my $sel = select(FILE_ONE);
my $sel = $FH;
$FH = FILE_ONE;
# print "HELLO\n";
print $FH "HELLO\n"; # print FILE_ONE "HELLO\n"
# $| = 1
disable_output_buffer ($FH); # disable_output_buffer (FILE_ONE)
# select(SOCKET_TWO);
$FH = SOCKET_TWO;
# print "HELLO\n";
print $FH "HELLO\n"; # print SOCKET_TWO "HELLO\n"
# $| = 1
disable_output_buffer ($FH); # disable_output_buffer (SOCKET_TWO)
# select($sel);
$FH = $sel;
答案 1 :(得分:0)
这是
的旧形式use IO::Handle;
FOUT->autoflush(1);