Perl 和外部程序

Posted

技术标签:

【中文标题】Perl 和外部程序【英文标题】:Perl and external programs 【发布时间】:2010-07-31 14:03:26 【问题描述】:

我有一个 Perl 程序和一个 C 程序。我想运行 Perl 程序并捕获 C 程序的返回值。说清楚:

C 程序 (a.out)

int main()

    printf("100");
    return 100;

Perl 程序:

print `ls`; #OK
print `a.out`; #No error but it does not print any output.

有什么想法吗? 谢谢。

【问题讨论】:

请告诉我们 a.out 不是你的 C source 文件 :-) 当你运行 a.out 时会发生什么命令行? 我打赌应该是./a.out,因为'.'通常不在 PATH 中。 'a.out' 是编译好的 C 程序,我也试过 './a.out'。 @paxdiablo: a.out 是以前的文件格式,仍然是默认文件名,例如没有提供二进制名称时的 GCC。见en.wikipedia.org/wiki/A.out @musikk,我实际上是在质疑 OP 是否创建了一个包含 source 代码的 a.out 文件(根据上面的 cmets,他们没有)。 【参考方案1】:

我不知道 perl,但这适用于我的系统,所以不能保证:

#!/usr/bin/perl

print "Running a.out now\n";
$exitCode = system("./a.out");
print "a.out returned:\n";
print $exitCode>>8; print "\n";

出于某种原因system() 返回按 8 位移位的返回值(因此 0 将变为 256,1 将变为 512... 7 将变为 1792 或类似的东西)但我不想查找为什么。

【讨论】:

OP 试图捕获程序的输出,而不是它的返回值。这就是反引号的作用。 @Ether:我不知道,但我认为他只是为了简洁而使用反引号,因为他的问题是“我想运行 Perl 程序并捕获 C 程序的返回值。”我猜他只是想要返回值。如果您知道如何捕获两者,并且只在我好奇时运行它。 见***.com/questions/109124/… @Ether 问题清楚地说明了返回值,所以系统是正确的方法【参考方案2】:

您的 C 程序没有打印回车,因此您可能会遇到行缓冲问题。

试试这个:

printf("100\n");

【讨论】:

【参考方案3】:

system() 将返回一个代码,指示您的 C 程序返回的内容或它是否被信号终止;假设后者不是这种情况,你可以这样做

$exitcode = system('a.out');
print "return code was ", $exitcode >> 8, "\n";

如果您还希望捕获输出,可以使用反引号,代码将在 $?变量。

$output = `a.out`;
$exitcode = $?;
print "return code was ", $exitcode >> 8, "\n";
print "output was:\n", $output;

您可能想要使用像 IPC::Cmd 这样的模块,它具有您可能需要的其他几个功能。

【讨论】:

以上是关于Perl 和外部程序的主要内容,如果未能解决你的问题,请参考以下文章

'perl' 不是内部或外部命令,也不是可运行的程序

如何从 Java 执行外部程序?

Perl,python和R如何从外部输入参数

Perl脚本记录外部可执行文件输出和错误,但仍然运行

如何在 Perl 中捕获输出和退出代码时执行外部脚本?

安装perl for win32 是用cmd的cd指令结果显示"perl"不是内部或外部命令,也不是可运行的程序或批处理文件。