2012-07-12 48 views
2

可能重複:
perl 「dollar sign and question mark」 question

我努力去理解別人寫的Perl腳本。我不明白在腳本中使用$?。任何人都可以解釋我下面的目的嗎?

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

http://perldoc.perl.org/perlvar.html – Mat 2012-07-12 12:19:57

回答

6

爲了找到任何變量的含義,你可以用相對較新的版本的Perl的命令行中輸入

$ perldoc -v '$?'

或掃描您的計算機安裝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; 
    } 

雖然沒有什麼不對,詢問甚至#2基本的問題,如果你真的想成爲一個capab程序員,你需要養成自己閱讀文檔的習慣,並開發自己理解的能力。

否則,您將浪費寶貴的時間來解決問題,而不是等待他人閱讀文檔。

如果您選擇永不花費任何努力來理解文檔,它確實不會影響我們其他人,但從長遠來看,它會傷害您。

0

use English;名稱爲$?$CHILD_ERROR。包括可能的信號號碼在內的小孩的退出狀態。請參閱perldoc perlvar

-1

$?是子進程的錯誤代碼(perform_task.sh)。

在腳本的情況下,返回代碼轉移八位與0 比較合適的,結果這意味着在運行時只考慮如果返回代碼是失敗>於255

+0

多數民衆贊成在精彩!現在我明白它實際上是什麼意思在代碼..感謝精心的答案.. – 2012-07-12 12:27:38

+2

位移的原因是'$?'包含由POSIX的'wait()'函數返回的完整的16位狀態,它包括進程的返回代碼和信號編號(如果有的話)會殺死它。如果返回碼不爲零,則測試失敗。 – friedo 2012-07-12 12:30:08