Perl:从另一个Perl脚本调用脚本 (注意:这是一个提问标题,不需要回答)

9

我有一个Perl脚本,调用另一个脚本。我使用反引号调用它,并将参数传递给该脚本,一切正常。

`CQPerl call_script.pl $agr1 $agr2 $arg3`;

但请建议是否有更好的方法来做到这一点。我该如何检查脚本出错是因为调用脚本还是被调用的脚本。我应该如何从调用脚本本身进行此检查?


反引号(backticks)可以捕获另一个脚本的标准输出;但你并没有对其进行太多操作(比如将其分配给某个变量)。你确定需要使用反引号吗? - Jonathan Leffler
使用autodie!https://dev59.com/9E_Ta4cB1Zd3GeqPDsE1 - daxim
2个回答

23
如果你想要进行错误检查,反引号可能不是一个正确的方法。你可能想要使用system函数。请看文档获取有关错误处理的所有详细信息,包括示例。
Perl 有许多执行其他脚本/命令的可能性:
  • 反引号/ qx{} 当你想在程序终止后一次性读取所有输出时
  • exec 当你希望将进程作为另一个程序继续运行——如果成功,永远不会返回
  • system 当你只对命令的成功或失败感兴趣时
  • open 当你想将信息管道传输到或从命令中获取信息时
  • dorequire 在此执行另一个 Perl 脚本。类似于 C 的 #include
  • 有些模块可以进行三向开放(three-way open),这样你就可以访问执行程序的STDINSTDOUTSTDERR。有关高级信息,请参阅perlipc的适当部分。
并且总是使用这些调用的多参数形式来避免 Shell 转义(可能很烦人且非常不安全)。

谢谢,我猜如果(system("CQPerl call_script.pl $arg1 $arg2 $agr3")) { print "ERROR: in calling script"; } 会回答我的问题。 - iDev
反引号(backticks)或qx返回的内容可以在标量或数组环境中捕获STDOUT行。system返回的内容包含退出代码或进程终止的信号。关于“do”:在perldoc中有一个例子,展示了如何实现错误处理。但是,我无法执行使用exit的另一个perl脚本,因为调用脚本总是停止。 - MattTT
在Perl脚本中,system调用的STDOUT / STDERR是否真的会丢失,还是有机会捕获它? - MattTT
@MattTT 子进程会继承来自父进程的文件描述符,例如 STDOUT。输出不会丢失,通常是直接绕过父进程并直接写入文件或终端。当然,您可以在父进程中重新打开 STDOUT,以便该文件描述符现在是一个管道,您可以(同时)在父进程中读取。但是 system() 在这里无法工作,因为此函数会阻塞,直到子进程完成。相反,您必须使用 fork() + exec()。此时,您正在重新发明 IPC::Run。 - amon

5

检查Perl特殊变量$?的值,以确定是否出现错误。


很好的功能,我不知道$?谢谢! - iDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接