加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:28:56 所属栏目:大数据 来源:网络整理
导读:253: my $sel = select(FOUT);254: $| = 1; # for DB::OUT255: select($sel); 看起来很奇怪,在Term :: ReadLine模块中发现. 解决方法 Writing to STDOUT (or any other output filehandle) is buffered by default. To ask Perl to flush immediately after
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 "HELLOn";
# equivalent to: print STDOUT "HELLOn";
my $sel = select(FILE_ONE);
# sets `default file handle` to FILE_ONE
print "HELLOn";
# equivalent to: print FILE_ONE "HELLOn";
$| = 1;
# disables output buffering on handle FILE_ONE
select(SOCKET_TWO)
# sets `default file handle` to SOCKET_TWO
print "HELLOn";
# equivalent to: print SOCKET_TWO "HELLOn";
$| = 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 "HELLOn";
my $FH = STDOUT;
print $FH "HELLOn"           # print STDOUT "HELLOn"

# my $sel = select(FILE_ONE);
my $sel = $FH;
$FH = FILE_ONE;

# print "HELLOn";
print $FH "HELLOn";          # print FILE_ONE "HELLOn"

# $| = 1
disable_output_buffer ($FH);  # disable_output_buffer (FILE_ONE)

# select(SOCKET_TWO);
$FH = SOCKET_TWO;

# print "HELLOn";
print $FH "HELLOn";          # print SOCKET_TWO "HELLOn"

# $| = 1
disable_output_buffer ($FH);  # disable_output_buffer (SOCKET_TWO)

# select($sel);
$FH = $sel;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读