【问题标题】:Perl operator: $|++; dollar sign pipe plus plusPerl 运算符:$|++;美元符号管加加
【发布时间】:2012-01-10 13:44:17
【问题描述】:

我正在编写已经发布的 perl 代码的新版本,并找到了以下行:

$|++;

AFAIK,$|与管道有关,正如in this link 所解释的那样,我理解这一点,但我无法弄清楚这里的 ++(加号)是什么意思。

提前谢谢你。

编辑:找到答案 in this link

简而言之:它会在下一条语句之前强制打印(刷新)到您的控制台,以防脚本太快。

有时,如果您将 print 语句放在运行得非常快的循环中,则在程序终止之前您将看不到 print 语句的输出。有时,您甚至根本看不到输出。这个问题的解决方案是在每个打印语句之后“刷新”输出缓冲区;这可以在 perl 中使用以下命令执行:

$|++;

[更新] 正如 r 所指出的那样。施瓦茨,我说错了;上面的命令导致 print 在下一个输出之前刷新缓冲区。

【问题讨论】:

    标签: perl expression


    【解决方案1】:

    $| 默认为 0;执行$|++ 从而将其增加到 1。将其设置为非零会在当前选定的文件句柄上启用自动刷新,默认情况下为 STDOUT,并且很少更改。

    所以效果是保证print之类的语句立即输出。如果您要输出到套接字等,这很有用。

    【讨论】:

    • Re "$|++ 因此将其增加到 1。",不完全。 $|++ 将其设置为 1,无论它之前有什么值。这是$| = 1;的“捷径”
    【解决方案2】:

    $|$OUTPUT_AUTOFLUSH 的缩写,正如您所发现的。 ++ 增加了这个变量。

    $| = 1 将是执行此操作的干净方式(恕我直言)。

    【讨论】:

    • 我同意$| = 1; 更清晰。毕竟,$|--; 不会关闭自动刷新。 (它切换它。)$|++; 是一个愚蠢的微优化。 (你真的需要这 10 纳秒吗?)
    • @ikegami,为什么你认为读取值、递增并放回它比简单地输入 1 快 10 纳秒?我认为只是作者发现这段代码更好看,他有权拥有自己的美感。
    • @Michael Krelin - 黑客,增量通常不涉及“放回”,但由于这是一个神奇的变量,所以这是有道理的。所以你是对的;这可能是我之前意识到的更愚蠢的优化,因为它实际上可能会减慢速度。
    • @ikegami,嘿,我已经在这个问题中了解到,它不会增加太多($|++ 永远不会超过 1)。是的,作为优化确实很愚蠢,但是,就像我说的,它不一定是优化。只是说同一件事的方式有很多种。
    • 请您在别处继续这个讨论吗?
    【解决方案3】:

    这是一个古老的习语,来自 IO::Handle 之前的日子。在现代代码中,这应该写成

    use IO::Handle; STDOUT->autoflush(1);

    【讨论】:

      【解决方案4】:

      它会增加自动刷新,这很可能相当于打开它。

      【讨论】:

      • 我想你可能是在开玩笑说绕到零,但有趣的是$| 是一个布尔值,试试$|=3; print $|
      • $| 只能取值 0 和 1,因此不能环绕。但是,--$| does "wrap around" 可用于切换 $|(而不是,例如,$|=1-$|$|=!$|)。
      • 不,我不是在开玩笑,我只是错了,假设它是一个数字。感谢指正,我会编辑掉环绕部分。
      猜你喜欢
      • 2023-03-03
      • 2023-03-30
      • 2022-01-05
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多