END块中的本地($?) - 为什么分配给它的值是多少?

时间:2013-02-21 01:52:27

标签: perl subroutine

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

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

  

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

我们不希望这种情况发生,因此我们在每个END块中放置一个local $?=$?;。但是现在程序将成功归功于操作系统,而实际上却失败了。

我设法将其分解为两个示例程序。一个按预期工作,一个失败。对于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 $?指定了什么值?

1 个答案:

答案 0 :(得分: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

非常奇怪。

错误报告已filed