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

Kev*_*Kev 7 perl

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

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

写入日志文件STDOUT并由函数执行,例如:

#!/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);
}
Run Code Online (Sandbox Code Playgroud)

值是否$|仅影响当前范围中的输出,即在此情况下脚本的全局范围?或者,在上面的例子中,它是否应该立即刷新STDOUT/ LOGFILE通过print语句writelog

yst*_*sth 8

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

您可以显式设置文件句柄,如:

LOGFILE->autoflush(1);
Run Code Online (Sandbox Code Playgroud)

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


ike*_*ami 7

$|不是一个pragma; 更改以"永久"方式$|更改当前selected文件句柄中的标志.默认情况下,该句柄是STDOUT.

您可以使用影响其他文件句柄

use IO::Handle qw( );  # Only required on older versions of Perl.
$handle->autoflush(1);
Run Code Online (Sandbox Code Playgroud)

这是一个捷径

my $temp = select($handle); $| = 1; select($temp);
Run Code Online (Sandbox Code Playgroud)

除了它试图处理异常.


mob*_*mob 3

Per具有全局范围perlvar$|并且仅适用于当前选定的输出通道。它STDOUT位于任何程序的开头,但可以通过 1-argselect调用进行更改。

$| = 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
Run Code Online (Sandbox Code Playgroud)