“魔法标点符号”的替代品是什么$|&引用;要在Perl中关闭打印缓冲区?

“魔法标点符号”的替代品是什么$|&引用;要在Perl中关闭打印缓冲区?,perl,cgi,Perl,Cgi,我正在重构一些旧代码(由其他人编写),在一些CGI脚本的顶部,我遇到了以下问题: #Turn on output buffering local $| = 1; perlcritic一如既往地毫无帮助地指出了显而易见的事实:“使用了神奇的标点符号”。有没有别的选择,或者perlcritic只是脾气暴躁 此外,在仔细检查之后。我认为代码是错误的 如果我没有弄错的话,它的意思与评论所说的完全相反。它关闭输出缓冲。我的内存有点生锈,似乎找不到描述这种神奇标点符号的Perl文档。这些脚本在mod_pe

我正在重构一些旧代码(由其他人编写),在一些CGI脚本的顶部,我遇到了以下问题:

#Turn on output buffering
local $| = 1;
perlcritic一如既往地毫无帮助地指出了显而易见的事实:“使用了神奇的标点符号”。有没有别的选择,或者perlcritic只是脾气暴躁

此外,在仔细检查之后。我认为代码是错误的

如果我没有弄错的话,它的意思与评论所说的完全相反。它关闭输出缓冲。我的内存有点生锈,似乎找不到描述这种神奇标点符号的Perl文档。这些脚本在mod_perl中运行


乱搞Perl的缓冲行为是否可取并导致性能提高?关于这一点的大部分文章都来自21世纪第一个十年的早期。这仍然是一个有效的好做法吗?

你的问题似乎有点分散,但我会尽力彻底回答

你想读书。报告说:

因此,是的,评论是不正确的。设置
$|=1
确实会禁用缓冲,而不是启用缓冲

至于性能,默认情况下启用输出缓冲的原因是因为这样可以提高性能——即使是在2011年——并且可能一直到时间的尽头,除非quantum I/O以某种方式改变了我们对I/O的理解方式

禁用输出缓冲的原因不是为了提高性能,而是为了以牺牲性能为代价改变其他行为

因为我不知道您的代码是做什么的,所以我无法推测它想要禁用输出缓冲的原因

禁用输出缓冲的一些(但并非全部)可能原因:

  • 您正在向套接字或管道写入数据,另一端需要立即响应
  • 您正在向控制台写入状态更新,并希望用户立即看到它们,而不是在一行的末尾。当您在每次操作后输出一个句点时,这种情况尤其常见
  • 对于CGI脚本,您可能希望浏览器在处理完成之前显示一些HTML输出

正如您可以在手册中查看的那样,$|=1关闭缓冲,表示缓冲区确实必须刷新,因此注释是错误的


关于它是好是坏,我不知道,但我也看到了CGI脚本中总是这样做,所以我怀疑在这种特殊情况下这是一件好事,可能是因为通常情况下,CGI脚本希望在写入数据后立即使其可用。

$|
是许多标点符号变量中的一个,实际上每个文件句柄都有标点符号变量。该变量获取或设置当前选定输出文件句柄的值(默认情况下为STDOUT)。(
$。
略有不同;它绑定到从中读取的最后一个文件句柄。)

访问这些文件的“现代”方式是通过filehandle上的方法:

use IO::Handle;
$fh->autoflush(1);  # instead of $|=1

与每个变量相对应的方法记录在中。

如其他人所述,注释不正确。相反,
local$|=1
禁用输出缓冲

要遵守的政策,您可以使用以下模块:


它以大表的形式生成一个巨大的报告。典型的东西。我没想到你会想禁用报告输出的缓冲。如果运行报告需要一段时间,并且在报告过程中显示某种状态,那么您可以禁用发送状态更新的文件句柄的缓冲,正如我在新编辑的回答中提到的那样。Perl总是充满惊喜(有些好,有些坏)。我已经使用Perl很长时间了,我从来没有遇到过英语模块。酷。
STDOUT
有一个文件句柄
use IO::Handle;
$fh->autoflush(1);  # instead of $|=1
use English qw( -no_match_vars );

local $OUTPUT_AUTOFLUSH = 1;  # equivalent to: local $| = 1