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 for win32 是用cmd的cd指令结果显示"perl"不是内部或外部命令,也不是可运行的程序或批处理文件。