Perl 端块中的局部($?)-为什么分配给它的值很重要?

Perl 端块中的局部($?)-为什么分配给它的值很重要?,perl,subroutine,Perl,Subroutine,在工作中,我们在与对象析构函数中的子进程交互时遇到错误,并最终将其跟踪到$?变量在等待调用期间被覆盖。这发生在调用exit()之后,所以$?另外还意味着我们的程序返回到操作系统的代码 具体来说,perldoc谈到了这类错误: 在结束子例程$中?包含将被赋予exit()的值。您可以修改$?在结束子例程中更改程序的退出状态 我们不希望这种情况发生,所以我们将local$?=$每个端块的内部。但是现在,这些程序将成功返回到操作系统,而实际上却无法完成给定的任务 我设法把它分解成两个示例程序。一个按预期

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

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

在结束子例程$中?包含将被赋予exit()的值。您可以修改$?在结束子例程中更改程序的退出状态

我们不希望这种情况发生,所以我们将
local$?=$每个端块的内部。但是现在,这些程序将成功返回到操作系统,而实际上却无法完成给定的任务

我设法把它分解成两个示例程序。一个按预期工作,一个失败。对于x86_64-linux-thread-multi,这在v5.8.8和v5.10.1上都会发生

程序A:(将0返回到操作系统)

程序B:(返回100到操作系统)


为什么将什么值分配给end块中的
本地$?
很重要?

看起来像是perl中的一个bug。显然,
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报告已经发布。

是的,这似乎不对。5.16.1的行为方式是添加链接以报告某人(您?)提交的错误。
% 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