当前位置:  开发笔记 > 编程语言 > 正文

在Perl中"select((select(s),$ | = 1)[0])"做什么?

如何解决《在Perl中"select((select(s),$|=1)[0])"做什么?》经验,为你挑选了5个好方法。

我见过用Perl编写的一些可怕的代码,但是我无法做出这个代码的头部和尾部:

select((select(s),$|=1)[0])

在我们用来与服务器通信的一些网络代码中,我认为它与缓冲有关(因为它设置$|).

但我无法弄清楚为什么有多个select调用或数组引用.谁能帮我吗?



1> Dan..:

这是一个讨厌的小成语,用于在除STDOUT之外的文件句柄上设置autoflush.

select() 获取提供的文件句柄并(基本上)用它替换STDOUT,并在它完成时返回旧的文件句柄.

因此(select($s),$|=1)重定向文件句柄(记住select返回旧文件句柄),并设置autoflush($| = 1).它在list((...)[0])中执行此操作并返回第一个值(这是select调用的结果- 原始STDOUT),然后将传递回另一个值select以恢复原始STDOUT文件句柄.唷.

但现在你明白了(好吧,也许;)),改为:

use IO::Handle;
$fh->autoflush;


在IO :: Handle-> autoflush存在之前,我写了那段丑陋的代码.请让它死于安静的死亡.:)
@Pax:为什么?看它!
@Randal:所以*你应该受到责备!我很抱歉将它描述为'讨厌',在IO :: Handle-> autoflush不存在的情况下,它确实是一个狡猾的小块代码;)(/我疯狂地反向)

2> brian d foy..:

找出任何代码的方法是将它分开.你知道括号内的东西发生在外面的东西之前.这与您弄清楚其他语言代码在做什么的方式相同.

第一位是:

( select(s), $|=1 )

该列表有两个元素,即两个操作的结果:一个选择s文件句柄作为默认值,然后一个选择设置$|为真值.的$|是仅适用于当前选定的文件句柄的每个文件句柄变量之一(参见了解全局变量在该有效Perler).最后,您有两个项目的列表:先前的默认文件句柄(结果select)和1.

下一部分是一个文字列表切片,用于拉出索引0中的项:

( PREVIOUS_DEFAULT, 1 )[0]

结果是以前的默认文件句柄的单个项目.

下一部分获取切片的结果并将其用作另一个调用的参数 select

 select( PREVIOUS_DEFAULT );

因此,实际上,您已经设置$|了一个文件句柄,最后回到了使用默认文件句柄开始的位置.


).最后,您有两个项目的列表:先前的默认文件句柄(结果

3> kennytm..:
select($fh)

选择新的默认文件句柄.请参阅http://perldoc.perl.org/functions/select.html

(select($fh), $|=1)

打开autoflush.见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页面所示.



4> Aristotle Pa..:

在另一个场地,我曾经提出过一个更易于理解的版本:

for ( select $fh ) { $| = 1; select $_ }

这保留了紧凑的习语的唯一优势,即不需要在周围范围内声明变量.

或者,如果你不舒服$_,你可以这样写:

for my $prevfh ( select $fh ) { $| = 1; select $prevfh }

范围$prevfh仅限于for块.(但是如果你写Perl,你真的没有理由对此感到怯懦$_.)



5> Andy Lester..:

这是一个非常聪明的代码,用于打开句柄上的缓冲区刷新s,然后重新选择当前句柄.

了解perldoc -f select更多.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有