我已经看到了一些可怕的代码写在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);

是更具有可读性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top