Perl,$|++做什么?

Perl,$|++做什么?,perl,Perl,我正在对一些perl代码进行分解,似乎是这样,perl有一些奇怪的结构,很难查找 在这种情况下,我遇到了以下问题 $|++; 这是在use语句之后的一行 此命令的作用是什么?查找变量最好使用perlvar perldoc perlvar,或者 由此: 句柄->自动刷新EXPR $OUTPUT\u自动刷新 $| 如果设置为非零, 在服务器上每次写入或打印后立即强制刷新 当前选择的输出通道。无论是否 通道是否真的由系统缓冲;$|只告诉你 是否在每次写入后显式要求Perl刷新。 如果输出到终端,则标

我正在对一些perl代码进行分解,似乎是这样,perl有一些奇怪的结构,很难查找

在这种情况下,我遇到了以下问题

$|++;
这是在use语句之后的一行


此命令的作用是什么?

查找变量最好使用perlvar perldoc perlvar,或者

由此:

句柄->自动刷新EXPR

$OUTPUT\u自动刷新

$|

如果设置为非零, 在服务器上每次写入或打印后立即强制刷新 当前选择的输出通道。无论是否 通道是否真的由系统缓冲;$|只告诉你 是否在每次写入后显式要求Perl刷新。 如果输出到终端,则标准输出通常是行缓冲的 而块缓冲则不然。设置此变量非常有用 主要是在输出到管道或插座时,例如 您正在rsh下运行一个Perl程序,并希望看到如下输出: 它正在发生。这对输入缓冲没有影响。有关详细信息,请参见getc 那个有关如何选择输出通道,请参见选择。另见 IO::句柄

++是增量运算符,它向变量中添加一个

因此$|++将autoflush true设置为默认值0+1=1,该值以布尔值形式求值为true,强制不缓冲对标准输出的写入。

来自:

$|

如果设置为非零,则在当前所选输出通道上的每次写入或打印之后立即强制刷新。无论系统是否真的缓冲了通道,默认值为0;$|只告诉您是否已在每次写入后显式要求Perl刷新。如果输出到终端,则标准输出通常为行缓冲,否则为块缓冲。设置此变量主要在输出到管道或套接字时有用,例如在rsh下运行Perl程序并希望在输出发生时查看输出时。这对输入缓冲没有影响。请参见getc。有关如何选择输出通道,请参见选择。另请参见IO::Handle

因此,由于它总是从0开始,因此会将其递增为1,从而在每次写入/打印后强制刷新

为了更清楚,您可以用以下内容替换它

use English '-no_match_vars';
$OUTPUT_AUTOFLUSH = 1;
$|是Perl的特殊变量之一

根据:

如果设置为非零,则在当前所选输出通道上的每次写入或打印之后立即强制刷新


如果Google是您唯一的信息源,那么我可以理解在Perl中查找特殊变量会如何引起恐慌。幸运的是,有佩尔多克!每台使用perl的机器也应该有perldoc。在不带命令行参数的情况下使用它,可以获得Perl版本附带的所有核心文档的列表

查找所有特殊变量:perldoc perlvar

要查找特定的特殊变量:perldoc-v'$|'on*nix, 在Windows上使用双引号

查找perl的函数列表:perldoc perlfunc

查找特定函数:perldoc-f sprintf

要查找运算符,包括优先级:perldoc perlop

有了这些信息,您就知道当您对输出Autoflush变量进行增量后会发生什么


作为一项特别的奖励,perldoc.perl.org可以管理除-v搜索之外的所有这些作业…

正如其他人所指出的,它可以在所选的输出文件句柄(可能是STDOUT)上启用自动刷新。不过,没有人说过,当您通常在重构和整理代码时,您确实应该用等效但更明显的代码替换它

STDOUT->autoflush(1);

啧啧。如果您使用英语,请始终使用英语“-no_match_vars”,否则您将受到正则表达式性能惩罚。请参阅以获取解释。感谢您添加了更简洁的替代方法。不要使用$|++,请使用$|=1;。前者给人一种误导性的印象,即递增和递减对$|起作用的方式与那些运算符对任何其他变量起作用的方式相同,而在这个特殊变量的情况下,它们不起作用。如果您确实需要一个可以使用++来实现的堆叠效果,您可以考虑本地$=1;@戴维多:有趣的是,佩尔多克没有提到$|的神奇行为。文档中是否有可以推断$|=0;$|-;将$|设置为1?$|++,因为按住shift键并输入$|然后敲击“+”键几次比释放shift键然后找到“=”键和“0”键更容易。@tjd如果stackable的意思是可以将其递增几次,并且在递减几次之前效果不会被移除,这是一个很好的例子,说明了使用带$的++运算符所导致的误解。您可以将其增加100倍,但其值仍然为1。将其递减一次将使其变回0。将其递减两次将触发它 又是1比1。如果这对你是有用的行为,请务必在旁边加上评论,这样人们就不会感到惊讶。