3

可能重复:
perl“美元符号和问号”问题

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

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

3 回答 3

10

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

$ perldoc -v '$?'

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

最后一个管道关闭、反引号 ( ``) 命令、成功调用wait()orwaitpid()system()操作员返回的状态。这只是传统 Unixwait()系统调用返回的 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 上问一些基本的问题都没有错,但如果你真的想成为一名有能力的程序员,你需要养成自己阅读文档的习惯,并培养自己理解它的能力。

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

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

于 2012-07-12T12:35:31.853 回答
1

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

于 2012-07-12T12:21:22.137 回答
-1

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

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

于 2012-07-12T12:23:23.057 回答