253: my $sel = select(FOUT);
254: $| = 1; # for DB::OUT
255: select($sel);
Run Code Online (Sandbox Code Playgroud)
在Term::ReadLine模块中发现,对我来说看起来很奇怪.
默认情况下,写入STDOUT(或任何其他输出文件句柄)是缓冲的.要在每次写入或打印命令后立即要求Perl刷新,请设置特殊变量$ | 到1.
http://www.perlhowto.com/disable_output_buffering
编辑:进一步说明:
my $sel = select(FOUT);
Run Code Online (Sandbox Code Playgroud)
FOUT是一个文件句柄,使用select它default file handle使得任何使用default file handlewill的操作现在都使用FOUT.例如print "moo"将相当于print FOUT "moo".
返回值select是前一个default file handle,即标准输出.
$| = 1;
Run Code Online (Sandbox Code Playgroud)
此命令禁用输出缓冲default file handle,因为句柄FOUT是禁用输出缓冲FOUT.
select($sel);
Run Code Online (Sandbox Code Playgroud)
现在我们带回前面的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);
Run Code Online (Sandbox Code Playgroud)
现在让我们来探讨那个神奇的事情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
Run Code Online (Sandbox Code Playgroud)
或者让我们发明一些新的变量:
$FH
# let this be the `default file handle`
Run Code Online (Sandbox Code Playgroud)
让我们发明一个新功能:
sub disable_output_buffer ($file_handle) {
# magic occurs here
}
Run Code Online (Sandbox Code Playgroud)
现在让我们使用这个新的文件句柄和函数重写前面的代码.
# 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;
Run Code Online (Sandbox Code Playgroud)