什么是"选择((选择(s),$|=1)[0])" 做Perl?
题
我已经看到了一些可怕的代码写在Perl,但我不能让头也不尾的这一:
select((select(s),$|=1)[0])
这是在一些网络的代码,我们使用通信的服务器和我假设它的东西来做缓冲(因为它将设置 $|
).
但我不能弄清楚为什么那里的多 select
电话或阵列参考。谁能帮帮我吗?
解决方案
它是比上一STDOUT文件句柄等设定自动冲洗一讨厌的小成语。
select()
取供给文件句柄和(基本上)与它取代STDOUT,并且当它这样做,它返回旧文件句柄。
因此(select($s),$|=1)
重定向文件句柄(记住select
返回旧的一个),并设置自动冲洗($| = 1
)。为此,它会在一个列表中((...)[0]
)并返回第一值(其是<=>调用的结果 - 原STDOUT),然后通过那回另一个<=>恢复原来的STDOUT文件句柄。呼。
但现在你明白了(好吧,也许;)),而是执行此操作:
use IO::Handle;
$fh->autoflush;
其他提示
的方式来找出任何代码是把它分开。你知道那东西括号内的情况发生之前的东西之外。这是同样的方式你要找出什么代码是这样做的其他语言。
第一点是:
( select(s), $|=1 )
该列表中有两个要素,这是结果的两个操作:一个选择 s
文件句柄作为默认的那一集 $|
一个真正的价值。的 $|
是一个每文件句柄变量只适用于当前选定的文件句柄(见 了解全球变量 在 有效珠工作室).在结束时,你有一个列表中的两个项目:以前的默认文件句柄(结果的 select
)和1。
接下来的部分是文字的列表以拉出的项目索引0:
( PREVIOUS_DEFAULT, 1 )[0]
结果,是个单一的项目是以前的默认文件句柄.
接下来的部分需要的结果的切片和使用它作为参数,另一个呼叫 select
select( PREVIOUS_DEFAULT );
因此,实际上,你已经设置 $|
在一个文件句柄,并结束了回到你开始,与默认文件句柄.
select($fh)
选择一个新的默认文件句柄。请参阅 http://perldoc.perl.org/functions/select.html
(select($fh), $|=1)
打开自动冲洗。请参阅 http://perldoc.perl.org/perlvar.html
(select($fh), $|=1)[0]
返回该元组的第一个值。
select((select($fh), $|=1)[0])
select
它,即恢复旧的默认的文件句柄。
相当于
$oldfh = select($fh);
$| = 1;
select($oldfh);
这意味着
use IO::Handle;
$fh->autoflush(1);
所证明的perldoc页。
在另一个场地,我曾提出一个更明显易懂版本将是这样的:
for ( select $fh ) { $| = 1; select $_ }
此保留不变量需要在周边范围被宣布为紧凑成语的唯一优点。
或者,如果你不舒服$_
,你可以写这样的:
for my $prevfh ( select $fh ) { $| = 1; select $prevfh }
$prevfh
的范围限定于for
块。 (但是,如果你写的Perl你真的没有借口是水性杨花<=>)
这是用于接通缓冲冲洗手柄上s
然后重新选择当前把手过于聪明代码。
请参阅perldoc -f select
更多。
请检查的perldoc -f选择。对于$|
的含义,请的perldoc perlvar
有overoptimization跳过加载IO ::句柄。
use IO::Handle;
$fh->autoflush(1);
是更具有可读性。