3

重複の可能性:
perlの「ドル記号と疑問符」の質問

誰かが書いた Perl スクリプトを理解しようとしています。$?スクリプトでの使用がわかりません。誰かが私に下の行の目的を説明できますか?

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

3 に答える 3

10

変数の意味を見つけるには、次のいずれかを入力できます

$ perldoc -v '$?'

perldoc perlvar比較的最近のバージョンの Perl またはスキャンがコンピューターにインストールされているコマンド ラインで。通常は、お使いの の特定のバージョンのドキュメントを読むのが最善perlですが、ピンチの場合、バージョンの違いによる問題が発生する可能性があることを念頭に置いて、オンライン バージョンでも同じことができます: perldoc -v '$?' :

最後のパイプ クローズ、バックティック ( ``) コマンド、 または への呼び出しの成功wait()、またはオペレーターwaitpid()からの呼び出しによって返されたステータス。system()これは、従来の Unix システム コールによって返される 16 ビットのステータス ワードwait()です (または、そのように見えるように構成されています)。したがって、サブプロセスの終了値は really($? >> 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 に答える