Questo è un bug in perl che verrà corretto in 5.22 (vedere il commento di Leon sotto).
Questo accade perché undef $f;
in realtà non liberare e distruggere $f
, solo che lo contrassegna come pronti per essere liberati da un nextstate
op.
nextstate
ops esistono approssimativamente tra ogni istruzione, e ci sono per pulire lo stack, tra le altre cose.
Nel tuo esempio, dal momento che undef $f
è l'ultima cosa nel file, non vi c'è NextState dopo di esso, in modo che il distruttore locale esce dallo scope prima $f
s' distruttore si chiama (o, la distruzione globale che guarda caso non è a conoscenza del tuo cambiamento locale.)
Quando si aggiunge una dichiarazione di stampa dopo undef $f
, il nextstate
op prima che la stampa chiama il distruttore locale.
È possibile visualizzare l'ulteriore nextstate
nell'esempio https://gist.github.com/calid/aeb939147fdd171cffe3#file-04-diff-concise-out.
È anche possibile vedere questo comportamento controllando caller()
nel metodo DESTROY
:
sub DESTROY {
my ($pkg, $file, $line) = caller;
print "Destroyed at $pkg, $file, $line\n";
c();
}
[email protected]:~$ perl foo.pl
Destroyed at main, foo.pl, 0
IN DESTROY
IN ORIG C
[email protected]:~$ echo 'print "hi\n"' >> foo.pl
[email protected]:~$ perl foo.pl
Destroyed at main, foo.pl, 30
IN DESTROY
IN MY C
hi
(Linea 30 è il print "hi\n"
)
speranza che getta luce su questo.
Cheers.
fonte
2015-03-24 11:09:37
Ancora meglio, questo problema è stato risolto in blead lo scorso agosto e la correzione sarà in 5.22 http: //perl5.git. perl.org/perl.git/commitdiff/4dda930be –