我有perl代码2,它是从perl代码1调用的。代码2的返回值确定,如果继续代码1,或退出。如何写这个逻辑。
代码1:
my $exit = `perl /home/username/code2.pl -f @flag_value`;
if($exit == 1){
#Do something;
exit ;
}else{
#Do somethingelse;
exit;
代码二:
subroutine(@flag_value);
sub subroutine{
my (@P)= @_;
#do req ops and assigns $exitcode
exit ($exitcode);
return $exitcode;
}
我无法建立如何将退出代码从代码2返回到1的逻辑。如果我返回$exitcode
值,$exit
就什么也没有。请帮助我了解我的错误。
尝试参考可用的解决方案,无法理解我的错误。
1条答案
按热度按时间vhmi4jdf1#
一个程序在退出时想要传递给调用者的信息通常是传递给exit的数字。†但是这个数字随后被打包到high(最高有效)16位字的8位,低位是指示是否存在核心转储的单个位,然后将 that 返回给调用者,并在
$?
变量中的Perl程序中使用。就像perlvar的医生说的那样
这只是传统Unix
wait()
系统调用返回的16位状态字(或者是被编出来的)。因此,子进程的退出值实际上是($? >> 8
),$? & 127
给出了进程死亡的信号(如果有的话),$? & 128
报告是否有核心转储。因此,在从另一个(“代码2”)调用的程序中,您将退出:
exit $exit_value;
.‡然后,调用程序(“代码1”)接收到的上述16位状态字位于
$?
变量中。为了获得被调用程序的实际退出值,我们需要通过右移$? >> 8
来提取高位。组织此变量的一种方法这里的qx是问题中使用的反勾的运算符形式,我认为这要好得多。查看system可以找到一种检查可能错误的方法。
最后,另一个很好的选择是使用库来调用和管理外部程序,这使得调用和管理外部程序变得非常容易。按照从简单到复杂的顺序,有些是IPC::System::Simple、Capture::Tiny、IPC::Run。
这里发布的内容有点简化,有些地方措辞可能不严谨;所提供的链接都是最低限度的学习要求,随着你的深入学习,会出现更多。在关于这方面的许多SO页面中,this page对那个“16位字”有清晰的ascii艺术和解释
†然而,通常情况下,状态为的
$?
在展开调用栈之前被设置,然后运行END
块(如果定义了)并调用全局析构函数(如果需要),这两者都可以改变退出值。这也发生在发出显式
exit
之后;程序可能不会在exit
之后立即退出。如果你想或需要确保没有END
块运行,也没有析构函数被调用,那么使用POSIX::_exit($status)‡这个“代码2”是一个程序,它可以在一个子程序中建立退出代码,如问题中所示。然后子程序将
return
that,以便exit
可以使用它。