"Konovalov, Vadim" <[EMAIL PROTECTED]> writes:
> Then following code has all desired behaviour within subs, as they seem to
> properly deleted at their time:
>
> my %srefs; # srefs = "stringinfied references"
>
> package better_sub;
>
> sub DESTROY {
> my $s = shift;
> delete $srefs{"$s"};
> print STDERR "I ($s) did my cleanup and go away\n";
> }
>
> package main;
>
> my $a = 1;
>
>
> for (0..3) {
> $s = sub { $a };
> bless $s, better_sub;
> $t = $s if $_==2;
> $srefs{"$s"}++;
> }
> #check if they are callable;
>
> print STDERR '{{',$s->(),$s->(),$t->(),$t->(),"}}\n";
>
> undef $s;
> undef $t;
>
> print STDERR '[[',(join '++',sort keys %srefs),']]';
>
> ----------------------------------------------------------------------
>
> When I played with this (still simple) code, I came into conclusion that it
> does what required. (otherwise please let me know)
The %srefs hash does not do anything useful in the program above. The
CVs called in the "print STDERR ...." line lives because the
references from $s and $t keep them alive. If the CV was passed to
Tcl, $s and $t cleared, then the code would be gone before Tcl called
back.
The current Tcl.pm code works because it does '$srefs{"$s"} = $s'
instead of the '$srefs{"$s"}++' you do above. This keeps the code
alive even after $s and $t are cleared.
--Gisle