【发布时间】:2011-06-21 14:57:50
【问题描述】:
我想检测我的对象是否被DESTROY'd 作为全局销毁的一部分,并打印出警告(因为这显然是一个错误并导致数据丢失)。这样做的明显方法似乎是:
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";
}
}'
【问题讨论】:
-
为什么不直接在销毁时保存您的对象内容,而不用担心它是否在全局销毁期间?
-
@Ether:因为全局销毁的顺序是不确定的,我需要其他对象来保存我的。
-
我看到(来自
Devel::GlobalDestruction来源)在 v5.13.7 中有一个适合此目的的${^GLOBAL_PHASE}变量。