में वैश्विक विनाश का पता लगाना मैं जानना चाहता हूं कि मेरा उद्देश्य वैश्विक विनाश के हिस्से के रूप में DESTROY
'डी है, और एक चेतावनी मुद्रित करें (क्योंकि यह स्पष्ट रूप से एक त्रुटि होगी और डेटा हानि का कारण बन जाएगा)। ऐसा करने के लिए स्पष्ट तरीका होने लगते हैं:पर्ल
sub DESTROY {
my $self = shift;
# ⋮
if (i_am_in_global_destruction()) {
warn "I survived until global destruction";
}
}
लेकिन मैं वैश्विक विनाश का पता लगाने के लिए एक अच्छा तरीका खोजने में असमर्थ किया गया है (सामान्य refcount के बजाय 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
@ ईथर: क्योंकि वैश्विक विनाश का आदेश अपरिभाषित है, और मुझे अपनी वस्तुओं को बचाने के लिए अन्य वस्तुओं की आवश्यकता है। – 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