仕事で、オブジェクトのデストラクタで子プロセスと対話するときにエラーが発生し、最終的に $? 変数は、待機呼び出し中に上書きされます。これは、exit() の呼び出しの後に発生するので、$? さらに、オペレーティング システムへのプログラムのリターン コードを意味します。
具体的には、perldoc はこの種のエラーについて話しました:
END サブルーチン内 $? exit() に渡される値が含まれています。$? を変更できますか? END サブルーチンで、プログラムの終了ステータスを変更します。
そうなってほしくないのでlocal $?=$?;
、すべての END ブロックの中に a を入れます。しかし今、プログラムは OS に成功を返しますが、実際には与えられたタスクに失敗しています。
2 つのサンプル プログラムに分割することができました。意図したとおりに機能するものと、失敗するもの。これは、x86_64-linux-thread-multi の v5.8.8 と v5.10.1 の両方で発生します。
プログラム A: (オペレーティング システムに 0 を返します)
END{ local $?=$?; }
exit(100);
プログラム B: (オペレーティング システムに 100 を返します)
END{ local $?=$?>>8; }
exit(100);
local $?
end ブロックでに割り当てられた値が問題になるのはなぜですか?