Del mismo modo, un array es una colección de ligaduras lógicas a valores escalares. Véase la figura 5.1
Perl mantiene un contador de referencias para cada valor existente
en el programa. Este contador se incrementa tanto si es usado directamente mediante
un nombre de variable como a través de una referencia.
En todo momento el contador de referencia del valor asociado con una variable $a
mantiene
el número de referencias existentes a dicha valor.
Puesto que hay una ligadura entre la variable $a
,
u valor, este contador es al menos uno. Véase la figura 5.2.
Si este contador desciende hasta cero, Perl
elimina la memoria asignada a ese valor. Los contadores descienden por diversas
razones. Por ejemplo, cada vez que termina un bloque, el contador
de los valores asociados con las variables declaradas en ese bloque desciende una unidad.
En el caso habitual de que el contador valiera 1, pasará a valer 0 y
la memoria asociada con el valor será liberada.
Existe un problema con este algoritmo de recolección de basura: las referencias circulares.
En esos casos el programador debe actuar usando, por ejemplo, el operador delete
.
El siguiente ejemplo muestra como los elementos de un array tienen sus propios contadores de referencias:
DB<1> @a = 1..5 DB<2> $ra = \$a[4] DB<3> pop @a DB<4> p @a 1234 DB<5> p $$ra 5la orden
pop @a
rompe la ligadura entre $a[4]
y el valor, esto
es, la ligadura-variable $a[4]
es eliminada del array.
Sin embargo el valor asociado no es eliminado de memoria ya
que su contador de referencias todavía no es cero. La variable $ra
aún esta referenciándolo.