4

在工作中,我们在对象的析构函数中与子进程交互时遇到了错误,最终追查到$? 在等待调用期间被覆盖的变量。这发生在调用 exit() 之后,所以 $? 另外意味着我们的程序返回给操作系统的代码。

具体来说,perldoc 谈到了这种错误:

在 END 子例程 $? 包含将要提供给 exit() 的值。你可以修改 $? 在 END 子例程中更改程序的退出状态。

我们不希望这种情况发生,所以我们local $?=$?;在每个 END 块中放置一个内部。但是现在这些程序将成功返回给操作系统,而实际上在给定任务中失败了。

我设法将其分解为两个示例程序。一种按预期工作,另一种失败。这发生在 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 $?最后块的值很重要?

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 回答