首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl的$| (OUTPUT_AUTOFLUSH)设置的范围是什么?

Perl的$| (OUTPUT_AUTOFLUSH)设置的范围是什么?
EN

Stack Overflow用户
提问于 2017-06-19 15:48:34
回答 4查看 549关注 0票数 7

我在一个安装了Perl5.8.8的旧CentOS 5.6服务器上运行了一个Perl脚本。不幸的是,我无法升级运行在此服务器上的操作系统或Perl版本。

当我从命令提示符运行这个脚本时,尽管脚本的顶部有一个$| = 1;语句(在全局范围内),它似乎仍然将输出缓冲到控制台(通过ssh会话)。

对日志文件和STDOUT的写入都由函数执行,例如:

代码语言:javascript
复制
#!/usr/bin/perl
$| = 1;

&writelog("Started...");

# Do work with lots of writelog'ing

&writelog("...Done.");

exit(0);

sub writelog {

    # This is greatly simplified for the purpose of this question

    my ($logentry) = @_;
    my $logfile = "/var/log/thelog.log";
    my $logline = "$logentry\n";
    print $logline;
    open (LOGFILE, ">>$logfile");
    print LOGFILE, "$logline";
    close (LOGFILE);
}

$|的值是否只影响当前范围中的输出,即在这种情况下脚本的全局范围?或者,在上面的示例中,它是否也会导致STDOUT/LOGFILEwritelog中的print语句立即刷新

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-06-19 15:55:20

根据perlvar$|具有全局范围,它仅适用于当前选定的输出通道。这是STDOUT在任何程序的开头,但可以通过1-arg select调用进行更改。

代码语言:javascript
复制
$| = 1;            # set autoflush on STDOUT
open LOGFILE, '>log';
my $fh = select LOGFILE;   # change "selected output channel"
$| = 1;            # set autoflush on LOGFILE
select $fh;        # restore STDOUT as "selected output channel"
$| = 0;            # turnoff autoflush on STDOUT
票数 3
EN

Stack Overflow用户

发布于 2017-06-19 15:52:54

$|只影响当前选定的默认输出文件句柄。

您可以显式地将其设置为文件句柄,如:

代码语言:javascript
复制
LOGFILE->autoflush(1);

请参阅http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles

票数 8
EN

Stack Overflow用户

发布于 2017-06-19 15:53:07

$|不是一个实用程序;更改$|将以“永久”的方式更改当前selected文件句柄中的标志。默认情况下,该句柄为STDOUT。

可以通过以下方式影响其他文件句柄

代码语言:javascript
复制
use IO::Handle qw( );  # Only required on older versions of Perl.
$handle->autoflush(1);

这是一条捷径

代码语言:javascript
复制
my $temp = select($handle); $| = 1; select($temp);

只是它试图处理异常。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44634898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档