我如何让一个perl脚本调用另一个perl脚本并获得返回结果?
我有perl脚本B,它做了很多数据库工作,什么都不打印,只需用0或3退出即可。
所以我希望perl脚本A调用脚本B并得到它的结果。但当我打电话给时
my $result = system("perl importOrig.pl filename=$filename");
或
my $result = system("/usr/bin/perl /var/www/cgi-bin/importOrig.pl filename=$filename");
我得到了一个-1,脚本B从未被调用。
我已经调试了脚本B,当手动调用时没有出现任何故障。
很明显,我在上面的电话中犯了一个错误,不确定是什么
有很多事情需要考虑。
Zeroth,有用于InterProcess Communication的perlpc文档。错误变量$!
的值是多少?
首先,使用$^X
,这是您正在执行的perl的路径。由于子流程继承了您的环境,因此您希望使用相同的perl,这样它就不会将自己与PERL5LIB
等混淆
system("$^X /var/www/cgi-bin/importOrig.pl filename=$filename")
其次,CGI程序倾向于期望设置特定的环境变量,例如REQUEST_METHOD
。将它们称为普通的命令行程序通常会忽略这些内容。试着从命令行运行该程序,看看它是如何抱怨的。检查它是否得到了它想要的环境。您还可以检查程序的权限,看看是否允许您(或运行调用程序的任何用户(读取它(或其目录等(。你说没有故障,所以也许这不是你的特殊问题。但是,这两种环境在所有方面都匹配吗?
第三,考虑使第二个程序成为模数。您可以从命令行将其作为脚本正常运行,但也可以将其作为Perl库加载并直接使用其功能。这就排除了IPC的所有内容。您甚至可以fork
,以便这些东西同时运行。