我想檢測我的對象是否爲DESTROY
'作爲全局破壞的一部分,並打印出警告(因爲這顯然是錯誤並導致數據丟失)。最明顯的方式做到這一點似乎是:在Perl中檢測全局破壞
sub DESTROY {
my $self = shift;
# ⋮
if (i_am_in_global_destruction()) {
warn "I survived until global destruction";
}
}
,但我一直無法找到檢測到全球毀滅的好方法(而不是普通的引用次數命中0破壞)。
通過「好辦法」,我的意思不是這個,這雖然它適用於5.9.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";
}
}'
爲什麼不簡單地保存你的對象內容時,它是DESTROYed,而不用擔心它是否在全球破壞或不是? – Ether 2011-02-04 21:12:30
@Ether:因爲全局破壞的順序是未定義的,所以我需要其他對象來保存我的東西。 – derobert 2011-02-04 21:30:21
我看到(來自`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 2011-02-04 21:45:38