Perl中内置变量$?的含义是什么?

3

可能重复:
perl中“dollar sign and question mark”问题

我正在尝试理解别人编写的Perl脚本。我不理解脚本中使用$?的用途。有人能解释一下下面一行的目的吗?

 system( "perform_task.sh", "-param1");
    if( ( $? >> 8 ) != 0 ) {
       print( "perform_task.sh failed " );
    } 

4
http://perldoc.perl.org/perlvar.html - Mat
3个回答

10

要查找任何变量的含义,您可以在命令行上键入

$ perldoc -v '$?'

对于相对较新的Perl版本,或者扫描安装在计算机上的perldoc perlvar,通常最好阅读您所拥有的特定版本的perl文档,但在紧急情况下,记住由于版本差异可能出现的任何问题,在线版本也可以使用:perldoc -v '$?'

上一个管道关闭、反引号(``)命令、wait()waitpid()的成功调用,或者system()运算符返回的状态。这只是传统Unix wait()系统调用返回的16位状态字(否则就是虚构的)。因此,子进程的退出值实际上是($? >> 8)$? & 127指示进程死亡时使用了哪个信号(如果有),而$? & 128报告是否有核心转储。perldoc -f system的文档中可以找到更多信息:

如果您想手动检查“system”的失败情况,可以通过像这样检查$?来检查所有可能的失败模式:

   if ($? == -1) {
       print "failed to execute: $!\n";
   }
   elsif ($? & 127) {
       printf "child died with signal %d, %s coredump\n",
           ($? & 127),  ($? & 128) ? 'with' : 'without';
   }
   else {
       printf "child exited with value %d\n", $? >> 8;
   }

虽然在Stackoverflow上询问基本问题并没有什么问题,但如果你真的想成为一名有能力的程序员,就需要养成自己阅读文档并理解文档的习惯。否则,你将浪费宝贵的时间等待别人替你阅读文档,而不是用来解决问题。
如果你选择从不尝试理解文档,这确实不会影响我们其他人,但长期来看会对你造成伤害。

1

use English; 命令用于设置变量名为英文。 $? 的英文名称是 $CHILD_ERROR,它包括子进程的退出状态和可能导致其退出的信号编号。请参阅 perldoc perlvar


-1

$? 是子进程(perform_task.sh)的错误代码。

在您的脚本中,返回代码向右移动了八位,并将结果与0进行比较。这意味着仅当返回的代码> 255时,运行才被视为失败。


太棒了!现在我明白代码实际上是什么意思了。感谢你详细的回答。 - Ghanta Sairam
2
位移的原因是 $? 包含 POSIX wait() 函数返回的完整 16 位状态,其中包括进程的返回代码和杀死它的信号编号(如果有)。如果返回代码为非零,则测试失败。 - friedo

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