in reply to Re: Q on $var = \$var;
in thread Q on $var = \$var;

Assigning a weakref yields a regular ref, and I think your test isn't quite right. Try (assuming $self/$next are references):
$self->{next} = $next; weaken($self->{next}) if $self == $next;
But that doesn't help with a longer circular chain; you need to pick the one element of the chain that has an external reference and weaken the preceding element's pointer to it.