Vorrei rilevare se il mio oggetto è DESTROY
'd come parte della distruzione globale e stampare un avviso (in quanto sarebbe chiaramente un errore e portare alla perdita di dati). Il modo più ovvio per farlo sembrerebbe essere:Rilevamento della distruzione globale in Perl
sub DESTROY {
my $self = shift;
# ⋮
if (i_am_in_global_destruction()) {
warn "I survived until global destruction";
}
}
ma sono stato in grado di trovare un buon modo per rilevare distruzione globale (al posto del normale refcount colpito 0 distruzione).
Per "buon modo", non intendo questo, che se funziona sul 5.10.1 e 5.8.8, probabilmente rompe il secondo qualcuno dà uno sguardo strano:
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";
}
}'
Perché non salvare semplicemente il contenuto dell'oggetto quando è DISTRUTTO, e non preoccuparsi se è durante la distruzione globale o no? – Ether
@Ether: Perché l'ordine di distruzione globale non è definito e ho bisogno di altri oggetti per salvare il mio. – derobert
Vedo (dal sorgente 'Devel :: GlobalDestruction') che nella v5.13.7 c'è un [' $ {^ GLOBAL_PHASE} '] (http://search.cpan.org/~jesse/perl-5.13.9 /pod/perl5137delta.pod#New_global_variable_${=GLOBAL_PHASE}) variabile adatta a questo scopo. – mob