Me gustaría detectar si mi objeto está siendo DESTROY
'como parte de la destrucción global, e imprimir una advertencia (ya que eso claramente sería un error y conduciría a la pérdida de datos). La manera obvia de hacer eso parecería ser:Detectando la destrucción global en Perl
sub DESTROY {
my $self = shift;
# ⋮
if (i_am_in_global_destruction()) {
warn "I survived until global destruction";
}
}
pero he sido incapaz de encontrar una buena manera de detectar la destrucción global (en lugar de golpear a la normalidad refcount 0 destrucción).
Por "buen sentido", quiero decir que no esta, que aunque funciona en 5.10.1 y 5.8.8, probablemente rompe la segunda a alguien le da una mirada extraña:
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";
}
}'
¿Por qué no simplemente guardar el contenido de su objeto cuando se DESTRUYE, y no preocuparse de si es durante la destrucción global o no? – Ether
@Ether: Porque el orden de destrucción global no está definido, y necesito otros objetos para salvar el mío. – derobert
Veo (de la fuente 'Devel :: GlobalDestruction') que en v5.13.7 hay un [' $ {^ GLOBAL_PHASE} '] (http://search.cpan.org/~jesse/perl-5.13.9 /pod/perl5137delta.pod#New_global_variable_${^GLOBAL_PHASE}) variable que se adapta a este propósito. – mob