Thread Kindobjekte schon gelöscht bei global destruction
(2 answers)
Opened by topeg at 2011-02-10 10:38
An weaken() habe ich nicht mehr gedacht.
Damit geht es auch: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 #!/usr/bin/perl use strict; use warnings; ######################################################################## package mytest; sub new { bless({obj=>{}, update=>0 },$_[0]); } sub add { my $self=shift; my $name=shift; my $obj=$self->{obj}; if($name && !exists($obj->{$name})) { my $val=shift; $obj->{$name}=mytest::child->new($name,$val,$self); $self->{update}=1; } } sub get { my $obj=shift->{obj}; return exists($obj->{$_[0]})?$obj->{$_[0]}:undef; } sub save { my $self=shift; my %obj=%{$self->{obj}}; if(%obj && $self->{update}) { # save dummy print $_->serialized() for(values(%obj)); } } sub DESTROY { my $self=shift; $self->save(); for(values(%{$self->{obj}})) { delete($_->{up}); } } ######################################################################## package mytest::child; use Scalar::Util 'weaken'; sub new { my $class=shift; my $self={}; $self->{name}=shift; $self->{val}=shift; $self->{up}=shift; bless($self,$class); weaken($self->{up}) if($self->{up}); return $self } sub val { my $self=shift; if(@_) { $self->{val}=shift; $self->{up}->{update}=1 if($self->{up}); } $self->{val}; } sub name{ shift()->{name}; } sub serialized { '{ '.join(', ',map{"$_ => ".$_[0]->{$_}}qw(name val))." }\n"; } ######################################################################## ######################################################################## ######################################################################## package main; use Data::Dumper; my $t=mytest->new(); $t->add(qw(test1 A)); $t->add(qw(test2 B)); $t->add(qw(test3 C)); $t->add(qw(test4 D)); print Dumper($t); |