私のオブジェクトがグローバル破壊の一部としてDESTROY
であるかどうかを検出したいと思います。警告が表示されます(これは明らかにエラーでデータ消失につながります)。それを行うには明白な方法があるように見えるでしょう:Perlでのグローバル破壊の検出
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
@Ether:グローバル破壊の順序は定義されていないので、私は私のものを保存するために他のオブジェクトが必要です。 – derobert
私は( '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