Cada vez que copie una referencia en una nueva variable, el recuento de referencias se incrementará. Esto es cierto cuando se copia una referencia débil o fuerte.
my $obj = {}; # 1 reference to {} stored in $obj
my $copy = $obj; # 2 references
weaken $obj; # 1 reference
en este punto, si $copy
sale del ámbito, la cuenta de referencia cae a cero, y la memoria serán liberados. Supongamos ahora el siguiente código:
my $newref = $obj; # 2 references
undef $copy; # 1 reference
Si Perl conserva la referencia débil en $newref
, entonces el hash se dealocated inesperadamente cuando $copy
fue despejada. Esto rompería la expectativa de que cuando copies una referencia, por lo menos se mantendrá mientras dure la copia.
En resumen, si las referencias débiles persistieran en una tarea, le obligaría a ensuciar su código con innumerables controles de debilidad, y requeriría alguna otra manera de desvincular una variable, todo para evitar los inevitables problemas de suicidio variable.
... ¿está seguro de que una subrutina puede devolver una referencia débil?Me parece que cualquier referencia debilitada creada dentro de una subrutina sería DESTRUIDA cuando esa referencia salga del alcance al final de la subrutina – Dancrumb
No devolvería un resultado de referencia débil en una copia implícita (lo que resultaría en una referencia fuerte) siendo devuelto)? – Cameron
@Dancrumb, @Cameron, puede devolver un objeto sobrecargado que almacena una referencia debilitada. – ysth