如何在Perl的反引号中刷新输出?

7
如果我有这个Perl应用程序:
print `someshellscript.sh`;

当一个 shell 脚本打印大量内容并且需要很长时间才能完成时,我该如何在脚本执行期间打印输出呢?

看起来 Perl 只会在 someshellscript.sh 完成后才打印结果,有没有办法在执行过程中刷新输出呢?

2个回答

16

你可能想要做的是像这样:

open(F, "someshellscript.sh|");
while (<F>) {
    print;
}
close(F);

这段代码运行 someshellscript.sh 脚本,并打开一个读取其输出的管道。 while 循环读取脚本生成的每一行输出并将其打印出来。欲了解更多信息,请参阅open文档页面。


4
我唯一要补充的是,通常最好使用词汇文件句柄:open my $fh, "someshellscript.sh|" or die $!; - friedo
3
@Nathan:(1)在包含作用域中,您无法意外覆盖现有的文件句柄;(2)词法文件句柄会在所有对该文件句柄的引用消失时自动关闭(通常在作用域退出时)。 - j_random_hacker

3
问题在于使用反引号进行转义会将脚本存储到一个字符串中,然后再进行打印。因此,没有办法通过打印来"刷新"输出。
使用system()命令应该能够连续打印输出,但是你将无法捕获输出内容。
system "someshellscript.sh";

+1. 编辑:我添加了一个system()的快速演示,并删除了我的回答,因为它是多余的。 - j_random_hacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接