在工作中,我们在与对象的析构函数中的子进程交互时遇到错误,并最终将其追踪到$?在等待调用期间被覆盖的变量.这是在调用exit()之后发生的,所以$?另外还意味着我们程序的返回代码到操作系统.
具体来说,perldoc谈到了这种错误:
在END子程序里面$?包含将给予exit()的值.你可以修改$?在END子例程中更改程序的退出状态.
我们不希望发生这种情况,因此我们将local $?=$?;
每个END块放在内部.但是现在程序将成功归功于操作系统,而实际上却失败了.
我设法将其分解为两个示例程序.一个按预期工作,一个失败.对于x86_64-linux-thread-multi,这在v5.8.8和v5.10.1上都会发生
程序A :(返回0到操作系统)
END{ local $?=$?; }
exit(100);
Run Code Online (Sandbox Code Playgroud)
程序B :(返回100到操作系统)
END{ local $?=$?>>8; }
exit(100);
Run Code Online (Sandbox Code Playgroud)
为什么local $?
在最终块中分配了什么值?
看起来像是perl中的一个bug.显然$?
in的自我分配local
被破坏了:
% perl -wle '$? = 123; print "before: $?"; local $? = $?; print "after: $?"'
before: 123
after: 0
Run Code Online (Sandbox Code Playgroud)
但是这个版本运行正常:
% perl -wle '$? = 123; print "before: $?"; local $? = $? + 0; print "after: $?"'
before: 123
after: 123
Run Code Online (Sandbox Code Playgroud)
很奇怪.
已提交错误报告.