gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:56:53 24 4
gpt4 key购买 nike

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使它成为 default file handle以便任何使用 default file handle 的操作现在将使用 FOUT .例如 print "moo"相当于 print FOUT "moo" .
select的返回值是以前的 default file handle ,即标准输出。
$| = 1;

此命令禁用 default file handle 上的输出缓冲。 , 因为句柄是 FOUTFOUT 禁用输出缓冲.
select($sel);

现在我们带回之前的 default file handle ,即标准输出,所以 print命令等按预期工作。

编辑#2:文件句柄的进一步解释:

假设您有一系列文件句柄 STDOUT , FILE_ONE , FILE_TWO , SOCKET_ONE , 和 SOCKET_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;

关于perl - 这样的代码的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6868802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com