这些代码的目的是什么?

时间:2011-07-29 04:56:09

标签: perl

253:        my $sel = select(FOUT);
254:        $| = 1;                             # for DB::OUT
255:        select($sel);

Term::ReadLine模块中发现,看起来很奇怪。

2 个答案:

答案 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:文件句柄的进一步说明:

想象一下,您有一系列文件句柄,STDOUTFILE_ONEFILE_TWOSOCKET_ONESOCKET_TWO。您希望将FILE_ONESOCKET_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);