【发布时间】:2012-02-06 08:16:50
【问题描述】:
我想在 Perl 中调用一个执行某些操作的 EXE 文件
我尝试通过 backtick 和 system 调用 exe 文件,但在这两种情况下我都只得到返回值
exe 文件在控制台上打印一些文本。是否也可以捕捉到这一点?
我查看了这个变量${^CHILD_ERROR_NATIVE},但我只得到返回值而不是文本
我正在使用 Perl 5.14
提前致谢
【问题讨论】:
我想在 Perl 中调用一个执行某些操作的 EXE 文件
我尝试通过 backtick 和 system 调用 exe 文件,但在这两种情况下我都只得到返回值
exe 文件在控制台上打印一些文本。是否也可以捕捉到这一点?
我查看了这个变量${^CHILD_ERROR_NATIVE},但我只得到返回值而不是文本
我正在使用 Perl 5.14
提前致谢
【问题讨论】:
应用程序可能不会将其输出打印到STDOUT,而是打印到STDERR,这不会被反引号运算符捕获。要同时捕获两者,您可以使用以下命令:
my $binary = 'foo.exe';
my $output = `$binary 2>&1`;
要进行更精细的捕获,您可能需要使用 IPC::Open3 来“控制”所有进程的流(IN、OUT 和 ERR)。
【讨论】:
我曾经从 perl 脚本执行命令并以这种方式捕获输出
sub execute_command() {
my($host) = @_;
open(COMMAND_IN, "your_command |");
while (<COMMAND_IN>)
{ #The COMMAND_IN will have the output of the command
#Read the output of your command here...
$ans = $_;
}
close(COMMAND_IN);
return $ans;
}
检查它是否对你有帮助
【讨论】:
我推荐Scriptalicious 中的capture 和capture_err 函数。
use Scriptalicious qw(capture);
my $output = capture('my_command', 'arg');
【讨论】:
use 5.006) 并将所有内容导出到调用命名空间 (@EXPORT)。将此模块与更现代的 perl 版本一起使用时可能会出现一些问题(重新定义 say f.ex.)。