检索另一个程序输出的最佳方法

时间:2014-10-02 17:50:00

标签: windows perl output

似乎我在检索我在perl脚本中执行的另一个应用程序的输出时遇到问题。

我试过用

# Option 1:
open( FH, "program -paramaeters |" ) or warn("$!");
while ( my $line = <FH> ) { print $line }

# Option 2: IPC::Run3's
run3( \@cmd, \undef, \$output );

# Option 3:
my $output = system("program");

# Option 4:
my $output = `program`;

# Option 5:
my $output = exec("program");

并且以上都没有捕获相关程序的确切字符串输出。

我只是想知道是否有比我之前列出的更好的方法。

编辑:

这适用于Windows系统

2 个答案:

答案 0 :(得分:2)

使用选项1,但像这样添加2>&1

open( FH, "program -paramaeters 2>&1 |" ) or warn("$!");
while ( my $line = <FH> ) { print $line }

这将捕获程序的stderr输出,就像stdout一样。

答案 1 :(得分:0)

基于您自己的选择的可能解决方案。

1 :(由Alcanzar提供,改进使用词法变量)将检索STDOUT&amp; STDERR合并在一起,逐行阅读。

open( my $FH, "program -paramaeters 2>&1 |" ) or warn("$!");
while ( my $line = <$FH> ) { print $line }

2a:检索STDOUT&amp; STDERR作为独立字符串。

run3( \@cmd, \undef, \$output, \$error );

2b:检索STDOUT&amp; STDERR作为独立的流,通过IO :: Pipe对象稍后读取,也许是逐行读取。

run3( \@cmd, \undef, $output, $error );

3:system()返回退出代码,而不是输出。 不是你想要的

4:很像选项#1。输出合并为一个字符串。

my $output = `program 2>&1`; 

5:exec():终止此程序并运行指定的程序。退出状态将返回到该程序的父级... 不是您想要的

<小时/> 如果子程序长时间运行,或者它的输出非常大,您可能希望避免使用解决方案#4(反引号)或用{{1替换解决方案#2(IPC :: Run3)中的标量引用对象。