perl – 这样的代码的目的是什么?
253: my $sel = select(FOUT); 254: $| = 1; # for DB::OUT 255: select($sel); 看起来很奇怪,在Term :: ReadLine模块中发现. 解决方法
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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |