gpt4 book ai didi

Perl die() 调用神秘地没有死

转载 作者:行者123 更新时间:2023-12-03 16:56:42 31 4
gpt4 key购买 nike

在对项目中一个非常模糊的错误进行了一些认真的调试之后,我能够得到这个简短的代码。一个没有死亡的死亡调用。
该问题仅在调用 script.pl 时发生。如果直接调用Class_A,那么die调用就会成功。
我们需要三个文件:
文件 1:script.pl

use strict;
use warnings;
use lib '.';
use Class_A;

# This should not execute. Class_A should die at loading time
print "We shouldn't get here. Class_A shoud not load and die.\n";
文件 2:Class_A.pm
package Class_A;
use strict;
use warnings;
use Class_B;

# This code SHOULD die:
my $p = Class_B->new;
$p->do_something->die_now;


1;
文件 3:Class_B.pm
package Class_B;
use strict;
use warnings;

sub new {
my $class = shift;
bless {}, $class;
}

sub do_something {
my $self = shift;
}

sub die_now {
die "No soup for you!";
}

sub DESTROY {
eval {
1;
};
}

1;
注意链式调用 at Class_A.pm line 8 吗?好吧,如果你解开它,那么代码就会成功终止。 :-|
# This works. There should be no difference.
$p->do_something;
$p->die_now;
而且,最后一个惊喜是通过删除 eval 调用 at Class_B.pm line 19 发现 ,然后事情按预期工作,脚本死了。
我有机会在 Perl 5.22.2Perl 5.26.1Perl 5.32.0 中对此进行测试。另一个奇妙的惊喜是,这个问题不仅仅发生在 5.32.0 上。
说真的,WT*?对这里发生的事情有什么想法吗?

最佳答案

您发布的代码从 5.28 开始就没有出现问题。
问题涉及$@在由于异常而发生的放松期间被破坏(使用 eval { } )。显然,未设置 $@愚弄 Perl 以为没有异常发生。
根据 perl528delta,$@现在在所有东西都被销毁后设置,这可以防止析构函数破坏 $@ .您还可以防止析构函数破坏 $@通过添加 local $@; (例如,支持旧版本的 Perl)。

关于Perl die() 调用神秘地没有死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63406689/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com