4

仕事で、オブジェクトのデストラクタで子プロセスと対話するときにエラーが発生し、最終的に $? 変数は、待機呼び出し中に上書きされます。これは、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 ブロックでに割り当てられた値が問題になるのはなぜですか?

4

1 に答える 1

7

perlのバグのようです。どうやら$?inの自己割り当てlocalが壊れています:

% perl -wle '$? = 123; print "before: $?"; local $? = $?; print "after: $?"'    
before: 123
after: 0

ただし、このバージョンは正常に機能します。

% perl -wle '$? = 123; print "before: $?"; local $? = $? + 0; print "after: $?"'
before: 123
after: 123

かなり奇妙です。

バグレポートが提出されました。

于 2013-02-21T02:00:31.587 に答える