微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Perl中关闭打印缓冲区的魔术标点符号“$|”有哪些替代方法?

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

#Turn on output buffering
local $| = 1;

perlcritic像往常一样无益地指出了显而易见的:“魔术标点符号使用”.有没有替代品或perlcritic只是脾气暴躁?

此外,仔细检查.我认为代码错误的.

如果我没有弄错的话,这意味着与评论所说的完全相反.它关闭输出缓冲.我的记忆有点生疏,我似乎无法找到描述这个神奇标点符号的Perl文档.脚本在mod_perl中运行.

是否可以解决Perl的缓冲行为并获得任何性能提升?关于此的大部分内容都来自21世纪头十年的早期.这仍然是一种有效的良好做法吗?

解决方法

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

你想阅读perldoc pervar. relevant section说:

$|      If set to nonzero,forces a flush right away and after every write or print on the currently selected output channel.  Default is 0
           (regardless of whether the channel is really buffered by the system or not; $| tells you only whether you've asked Perl explicitly to
           flush after each write).  STDOUT will typically be line buffered if output is to the terminal and block buffered otherwise.  Setting this
           variable is useful primarily when you are outputting to a pipe or socket,such as when you are running a Perl program under rsh and want
           to see the output as it's happening.  This has no effect on input buffering.  See "getc" in perlfunc for that.  See "select" in perldoc
           on how to select the output channel.  See also IO::Handle. (Mnemonic: when you want your pipes to be piping hot.)

所以,是的,评论是不正确的.设置$| = 1确实禁用缓冲,而不是打开它.

至于性能,认情况下启用输出缓冲的原因是因为这可以提高性能 – 即使在2011年 – 并且可能直到时间结束,除非量子I / O以某种方式改变了我们完全理解I / O的方式.

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

由于我不知道你的代码做了什么,我不能推测它想要禁用输出缓冲的原因.

禁用输出缓冲的一些(但绝不是全部)可能的原因:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐