Perl 的 $| 吗? 设置影响系统命令吗?

发布于 2024-07-24 23:09:52 字数 223 浏览 3 评论 0原文

我正在查看 Perl 中的一些旧代码,作者在其中编写了 <代码>$| = 1 在第一行。

但该代码没有任何打印语句,它使用 system 命令调用 C++ 二进制文件。 现在我读到 $| 将在每次打印后强制刷新。 那么它是否会以任何方式影响系统命令的输出,或者我是否可以安全地删除该行。

谢谢 阿尔文德

I am looking at some old code in Perl, where the author has writtern
$| = 1 in the first line.

But the code does not have any print statements, it calls a C++ binary using the system command. Now I read that $| will force flush after every print. So does it affect the system command's output in any way or am I safe to remove that line.

Thanks
Arvind

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

宫墨修音 2024-07-31 23:09:52

我不这么认为。 $| 会影响 Perl 的运行方式,而不是任何外部可执行文件。

您应该可以安全地将其删除。

perldoc - perlvar :状态“如果设置为非零,则立即和之后强制刷新当前所选输出通道上的每次写入或打印。”。 我认为这里重要的是“当前选择的输出通道”。 外部应用程序将有其自己的输出通道。

I do not believe so. The $| will affect the way that Perl is running, not any external executable.

You should be safe to remove it.

perldoc - perlvar : States "If set to nonzero, forces a flush right away and after every write or print on the currently selected output channel.". I think the important thing here is the "currently selected output channel". The external application will have it's own output channel.

樱娆 2024-07-31 23:09:52

对于这样的问题,通常很容易编写一个简单的程序来显示行为是什么:

#!/usr/bin/perl

use strict;
use warnings;

if (@ARGV) {
    output();
    exit;
}

print "in the first program without \$|:\n";
output();

$| = 1;
print "in the first program with \$|:\n";
output();

print "in system with \$|\n";
system($^X, $0, 1) == 0
    or die "could not run '$^X $0 1' failed\n";

$| = 0;
print "in system without \$|\n";
system($^X, $0, 1) == 0
    or die "could not run '$^X $0 1' failed\n";

sub output {
    for my $i (1 .. 4) {
        print $i;
        sleep 1;
    }
    print "\n";
}

从中我们可以看到,设置 $| 对通过 system

With questions like this it is often easy to write a trivial program that shows what the behavior is:

#!/usr/bin/perl

use strict;
use warnings;

if (@ARGV) {
    output();
    exit;
}

print "in the first program without \$|:\n";
output();

$| = 1;
print "in the first program with \$|:\n";
output();

print "in system with \$|\n";
system($^X, $0, 1) == 0
    or die "could not run '$^X $0 1' failed\n";

$| = 0;
print "in system without \$|\n";
system($^X, $0, 1) == 0
    or die "could not run '$^X $0 1' failed\n";

sub output {
    for my $i (1 .. 4) {
        print $i;
        sleep 1;
    }
    print "\n";
}

From this we can see that setting $| has no affect on programs run through system.

长途伴 2024-07-31 23:09:52

您可以轻松地自行检查这一点。 创建一个缓冲很重要的程序,例如打印一系列点。 由于输出被缓冲,您应该在十秒后立即看到所有输出:

#!perl

foreach ( 1 .. 10 )
    {
    print ".";
    sleep 1;
    }

print "\n";

现在,尝试设置 $| 并使用 system 调用它:

 % perl -e "$|++; system( qq|$^X test.pl| )";

对于我的测试用例,$ | 值不影响子进程中的缓冲。

This is something that you can easily check yourself. Create a program where buffering matters, like printing a series of dots. You should see the output all at once after ten seconds since the output is buffered:

#!perl

foreach ( 1 .. 10 )
    {
    print ".";
    sleep 1;
    }

print "\n";

Now, try setting $| and calling this with system:

 % perl -e "$|++; system( qq|$^X test.pl| )";

For my test case, the $| value didn't affect the buffering in the child process.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文