我希望能够检测到我的对象是否在全局销毁的过程中被DESTROY
,并打印出警告信息(因为这显然是一个错误,并会导致数据丢失)。看起来最明显的方法是:
sub DESTROY {
my $self = shift;
# ⋮
if (i_am_in_global_destruction()) {
warn "I survived until global destruction";
}
}
但是我一直无法找到一个好的方法来检测全局销毁(而不是正常的引用计数为0销毁)。
所谓“好的方法”,我的意思是不是这个,虽然它在5.10.1和5.8.8上可以工作,但很可能在有人对它进行奇怪的注视时就会崩溃:
sub DESTROY {
$in_gd = 0;
{
local $SIG{__WARN__} = sub { $_[0] =~ /during global destruction\.$/ and $in_gd = 1 };
warn "look, a warning";
}
if ($in_gd) {
warn "I survived until global destruction";
}
}'
Devel::GlobalDestruction
源代码中看到,在v5.13.7中有一个${^GLOBAL_PHASE}
变量(http://search.cpan.org/~jesse/perl-5.13.9/pod/perl5137delta.pod#New_global_variable_${^GLOBAL_PHASE}),非常适合这个目的。 - mob