in reply to use Switch wierdness
I'm guessing this is a bug.
It is a known behaviour, Perl's "global destruction" phase doesn't obey reference counts, and the order of destruction isn't guaranteed , so $perldata gets destroyed before $c/$b,
The solution to this kind of thing is to arrange for global objects to get destroyed before and to use weak references
use DBI; $perldata = bless { hello => 'world' }, 'superman' ; @ARGV and $perldata = { hello => 'world' } ; sub test { my( $o, $v ) = @_; my $m = bless { v => $v, perldata => $o }, 'TQIS::test' ; warn "$m $$m{v}"; return $m ; } sub TQIS::test::DESTROY { my $self = shift ; warn "$self $$self{v} => $$self{perldata} "; } $a = test( $perldata , 'a') ; $b = test( $perldata , 'b' ) ; $c = test( $perldata , 'c' ) ; __END__ $ perl junk TQIS::test=HASH(0x3f8b5c) a at junk line 9. TQIS::test=HASH(0x99a88c) b at junk line 9. TQIS::test=HASH(0xa57854) c at junk line 9. TQIS::test=HASH(0xa57854) c => at junk line 15 during global destruc +tion. TQIS::test=HASH(0x99a88c) b => at junk line 15 during global destruc +tion. TQIS::test=HASH(0x3f8b5c) a => superman=HASH(0x3f8a7c) at junk line 1 +5 during global destruction. $ perl junk --nobless TQIS::test=HASH(0x99a43c) a at junk line 9. TQIS::test=HASH(0x99a97c) b at junk line 9. TQIS::test=HASH(0xa576a4) c at junk line 9. TQIS::test=HASH(0xa576a4) c => HASH(0x3f8d04) at junk line 15 during +global destruction. TQIS::test=HASH(0x99a97c) b => HASH(0x3f8d04) at junk line 15 during +global destruction. TQIS::test=HASH(0x99a43c) a => HASH(0x3f8d04) at junk line 15 during +global destruction.
See also Re: sub DESTROY: Strange ordering of object destruction
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: use Switch wierdness
by tqisjim (Beadle) on Aug 27, 2012 at 14:49 UTC |