如何在perl中将退出代码从一个程序返回到另一个程序

koaltpgm  于 2022-12-13  发布在  Perl
关注(0)|答案(1)|浏览(178)

我有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就什么也没有。请帮助我了解我的错误。
尝试参考可用的解决方案,无法理解我的错误。

vhmi4jdf

vhmi4jdf1#

一个程序在退出时想要传递给调用者的信息通常是传递给exit的数字。†但是这个数字随后被打包到high(最高有效)16位字的8位,低位是指示是否存在核心转储的单个位,然后将 that 返回给调用者,并在$?变量中的Perl程序中使用。
就像perlvar的医生说的那样
这只是传统Unix wait()系统调用返回的16位状态字(或者是被编出来的)。因此,子进程的退出值实际上是($? >> 8),$? & 127给出了进程死亡的信号(如果有的话),$? & 128报告是否有核心转储。
因此,在从另一个(“代码2”)调用的程序中,您将退出:exit $exit_value; .‡
然后,调用程序(“代码1”)接收到的上述16位状态字位于$?变量中。为了获得被调用程序的实际退出值,我们需要通过右移$? >> 8来提取高位。组织此变量的一种方法

my $output = qx( code2.pl ... );

# First investigate $? & 127 and $? & 128, see "system" for an example
my $exit_value = $? >> 8;

if ($exit_value == 1) ...

这里的qx是问题中使用的反勾的运算符形式,我认为这要好得多。查看system可以找到一种检查可能错误的方法。
最后,另一个很好的选择是使用库来调用和管理外部程序,这使得调用和管理外部程序变得非常容易。按照从简单到复杂的顺序,有些是IPC::System::SimpleCapture::TinyIPC::Run
这里发布的内容有点简化,有些地方措辞可能不严谨;所提供的链接都是最低限度的学习要求,随着你的深入学习,会出现更多。在关于这方面的许多SO页面中,this page对那个“16位字”有清晰的ascii艺术和解释
†然而,通常情况下,状态为的$?在展开调用栈之前被设置,然后运行END块(如果定义了)并调用全局析构函数(如果需要),这两者都可以改变退出值。
这也发生在发出显式exit之后;程序可能不会在exit之后立即退出。如果你想或需要确保没有END块运行,也没有析构函数被调用,那么使用POSIX::_exit($status)
‡这个“代码2”是一个程序,它可以在一个子程序中建立退出代码,如问题中所示。然后子程序将return that,以便exit可以使用它。

# code2.pl

use warnings;
use strict;

...
    
sub subroutine{
    my (@P)= @_;
    #do req ops and assigns $exitcode
    ...    
    return $exitcode;
}

...

exit subroutine(@flag_value);

相关问题