perl – 这样的代码的目的是什么?

前端之家收集整理的这篇文章主要介绍了perl – 这样的代码的目的是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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”.

select的返回值是先前的默认文件句柄,即标准输出.

$| = 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;

猜你在找的Perl相关文章