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

前端之家收集整理的这篇文章主要介绍了perl – END块中的本地($?) – 为什么分配给它的值是多少?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在工作中,我们在与对象的析构函数中的子进程交互时遇到错误,并最终将其追踪到$?在等待调用期间被覆盖的变量.这是在调用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.

我们不希望这种情况发生,所以我们把一个本地$?= $?;在每个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);

为什么分配给本地$的价值是多少?在最后一块?

解决方法

看起来像是perl中的一个bug.显然是自我分配$?在当地被打破:

% 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.

猜你在找的Perl相关文章