代码之家  ›  专栏  ›  技术社区  ›  planetp

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

  •  0
  • planetp  · 技术社区  · 14 年前

    我见过一些用Perl编写的可怕代码,但我无法理解这一点:

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

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

    但我不明白为什么会有多个 select 调用或数组引用。有人能帮我吗?

    0 回复  |  直到 8 年前
        1
  •  64
  •   Dan Aditi    16 年前

    这是一个讨厌的小习惯用法,用于在STDOUT以外的文件句柄上设置autoflush。

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

    (select($s),$|=1) 重定向文件句柄(记住 select 返回旧的),并设置自动刷新( $| = 1 ). 它在列表中这样做( (...)[0] 那个 回到另一个世界 选择 恢复原来的标准输出文件句柄。呸。

    use IO::Handle;
    $fh->autoflush;
    
        2
  •  29
  •   brian d foy    9 年前

    ( select(s), $|=1 )
    

    该列表有两个元素,它们是两个操作的结果:一个用于选择 s filehandle作为默认值,然后设置一个 $| $| Understand global variables ). 最后,您有两个项目的列表:前一个默认的filehandle( select ),和1。

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

    ( PREVIOUS_DEFAULT, 1 )[0]
    

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

     select( PREVIOUS_DEFAULT );
    

    所以,实际上,你已经 $| 在一个文件句柄上,并返回到使用默认文件句柄开始的位置。

        3
  •  20
  •   kennytm    14 年前
    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页面所示。

        4
  •  10
  •   Aristotle Pagaltzis    16 年前

    在另一个场合,我曾提出一个更容易理解的版本:

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

    $_ ,你可以这样写:

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

    范围 $prevfh 仅限于 for 阻止。(但是如果你编写Perl,你真的没有理由对此感到不安 $_ .)

        5
  •  8
  •   Andy Lester    16 年前

    s 然后重新选择当前句柄。

    看到了吗 perldoc -f select

        6
  •  2
  •   ghostdog74    14 年前

    请检查 perldoc -f select . 关于 $| ,请检查 perldoc perlvar

        7
  •  2
  •   Alexandr Ciornii    14 年前

    use IO::Handle;
    $fh->autoflush(1);