2013-02-21 89 views
4

在工作中,我們在與對象的析構函數中的子進程交互時遇到錯誤,並最終將其跟蹤到$?變量在等待呼叫期間被覆蓋。這發生在調用exit()之後,所以$?另外意味着我們的程序返回到操作系統的代碼。

具體來說,的perldoc談到這種錯誤的:

Inside an END subroutine $? contains the value that is going to be given to exit(). You can modify $? in an END subroutine to change the exit status of your program.

我們不希望這樣的事情發生,所以我們把一個local $?=$?;每END塊內。但是現在這些程序將成功轉交給操作系統,而實際上他們的任務失敗了。

我設法把它分解成兩個示例程序。一個按預期工作,一個失敗。這發生在兩個v5.8.8和v5.10.1爲x86_64的Linux的線程多

方案A:(返回0到操作系統)

END{ local $?=$?; } 
exit(100); 

方案B:(100返回到操作系統)

END{ local $?=$?>>8; } 
exit(100); 

事爲什麼它什麼價值被分配到終端模塊的local $?

+0

是的,這似乎不正確。 5.16.1也是這樣的 – ikegami 2013-02-21 03:49:48

回答

7

看起來像Perl中的錯誤。在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 

相當離奇。

的bug報告已經filed

+1

這是一個很棒的發現! – mob 2013-02-21 02:02:10

+0

添加鏈接到錯誤報告某人(你?)提交。 – ikegami 2013-02-21 03:52:16

相關問題