253: my $sel = select(FOUT); 254: $| = 1; # for DB::OUT 255: select($sel);
看起来很奇怪,在Term :: ReadLine模块中发现.
解决方法
Writing to STDOUT (or any other output filehandle) is buffered by
default. To ask Perl to flush immediately after each write or print
command,set the special variable $| to 1.
http://www.perlhowto.com/disable_output_buffering
编辑:进一步说明:
my $sel = select(FOUT);
FOUT是一个文件句柄,使用select使其成为默认文件句柄,因此使用默认文件句柄的任何操作现在都将使用FOUT.例如,打印“moo”将相当于打印FOUT“moo”.
$| = 1;
此命令禁用默认文件句柄上的输出缓冲,因为句柄是FOUT,禁用FOUT的输出缓冲.
select($sel);
现在我们带回以前的默认文件句柄,即标准输出,因此打印命令等按预期工作.
编辑#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);
现在让我们来看看这个神奇的默认文件句柄会发生什么.
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;