这些代码的目的是什么?

new*_*erl 5 perl

253:        my $sel = select(FOUT);
254:        $| = 1;                             # for DB::OUT
255:        select($sel);
Run Code Online (Sandbox Code Playgroud)

Term::ReadLine模块中发现,对我来说看起来很奇怪.

Ste*_*e-o 8

默认情况下,写入STDOUT(或任何其他输出文件句柄)是缓冲的.要在每次写入或打印命令后立即要求Perl刷新,请设置特殊变量$ | 到1.

http://www.perlhowto.com/disable_output_buffering

编辑:进一步说明:

my $sel = select(FOUT);
Run Code Online (Sandbox Code Playgroud)

FOUT是一个文件句柄,使用selectdefault 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)