【问题标题】:What is the meaning of the built-in variable $? in Perl [duplicate]内置变量$是什么意思?在 Perl [重复]
【发布时间】:2012-07-12 04:39:36
【问题描述】:

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

我正在尝试理解某人编写的 Perl 脚本。我不明白脚本中$? 的使用。谁能解释一下下一行的目的?

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

【问题讨论】:

标签: perl system


【解决方案1】:

要查找任何变量的含义,您可以键入

$ perldoc -v '$?'

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

最后一个管道关闭、反引号 (``) 命令返回的状态,成功调用 wait()waitpid(),或来自 system() 运算符。这只是传统 Unix wait() 系统调用返回的 16 位状态字(或者被编造出来的样子)。因此,子进程的退出值实际上是($? >> 8)$? & 127 给出了进程死于哪个信号(如果有),$? & 128 报告是否存在核心转储。

更多信息可以从perldoc -f 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 上问一些基本的问题都没有错,但如果你真的想成为一名有能力的程序员,你需要养成自己阅读文档的习惯,并培养自己理解文档的能力。

否则,您将浪费宝贵的时间来解决问题,而不是等待其他人为您阅读文档。

如果您选择从不花任何精力尝试理解文档,这确实不会影响我们其他人,但从长远来看,它会伤害您。

【讨论】:

    【解决方案2】:

    $?use English; 名称是 $CHILD_ERROR。这是孩子的退出状态,包括导致它退出的可能信号号。见perldoc perlvar

    【讨论】:

      【解决方案3】:

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

      对于您的脚本,返回码向右移动 8 位,并将结果与​​ 0 进行比较。 这意味着仅当返回的代码大于 255 时才会认为运行失败。

      【讨论】:

      • 太棒了!..现在我明白了它在代码中的实际含义..感谢您的详尽回答..
      • 移位的原因是$? 包含由 POSIX wait() 函数返回的完整 16 位状态,其中包括进程的返回码和杀死的信号号(如果有)它。如果返回码不为零,则测试失败。
      猜你喜欢
      • 2012-07-20
      • 2018-03-05
      • 2013-03-28
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2015-11-19
      • 1970-01-01
      相关资源
      最近更新 更多