Ejemplo

El siguiente ejemplo, debido a Ikegami (PerlMonks), está tomado de una respuesta en PerlMonks. Suponga el siguiente código:

1 my $array_ref = [];
2 for(1 .. 2) {
3     my $hash_ref = { foo => foo, bar => bar };
4     push(@{$array_ref}, $hash_ref);
5 }
6 
7 my $hash_ref = $array_ref->[0];
8 $array_ref = [];

Estado después de la línea 7:

 $array_ref                                    $hash_ref
+--------------+                              +--------------+
| array ref    |                              | hash ref     |
+--------------+                              +--------------+
| refcount = 1 |                              | refcount = 1 |
+--------------+    +--------------------+    +--------------+
|           o=====> | array              |    |           o  |
+--------------+    +--------------------+    +---------- : -+    
                    | refcount = 1       |                :
                    +--------------------+                :
                    | element 0          |                :
                    |  +--------------+  |                :
                    |  | hash ref     |  |                :
                    |  +--------------+  |                :
                    |  | refcount = 1 |  |                V
                    |  +--------------+  |    +--------------+
                    |  |           o========> | hash         |
                    |  +--------------+  |    +--------------+
                    +--------------------+    | refcount = 2 |
                    | element 1          |    +--------------+
                    |  +--------------+  |    | keys & vals  |
                    |  | hash ref     |  |    +--------------+
                    |  +--------------+  |
                    |  | refcount = 1 |  |
                    |  +--------------+  |    +--------------+
                    |  |           o========> | hash         |
                    |  +--------------+  |    +--------------+
                    +--------------------+    | refcount = 1 |
                                              +--------------+
                                              | keys & vals  |
                                              +--------------+

Despúes que se sobreescriba la referencia al array (línea 8):

+--------------+                              +--------------+
| array ref    |                              | hash ref     |
+--------------+                              +--------------+
| refcount = 1 |                              | refcount = 1 |
+--------------+    +--------------------+    +--------------+
|           o  |    | array              |    |           o  |
+---------- : -+    +--------------------+    +---------- : -+
            :       | refcount = 0       |                :
            :       +--------------------+                :
            V       | element 0          |                :
+--------------+    |  +--------------+  |                :
| array        |    |  | hash ref     |  |                :
+--------------+    |  +--------------+  |                :
| refcount = 1 |    |  | refcount = 1 |  |                V
+--------------+    |  +--------------+  |    +--------------+
| no elements  |    |  |           o========> | hash         |
+--------------+    |  +--------------+  |    +--------------+
                    +--------------------+    | refcount = 2 |
                    | element 1          |    +--------------+
                    |  +--------------+  |    | keys & vals  |
                    |  | hash ref     |  |    +--------------+
                    |  +--------------+  |
                    |  | refcount = 1 |  |
                    |  +--------------+  |    +--------------+
                    |  |           o========> | hash         |
                    |  +--------------+  |    +--------------+
                    +--------------------+    | refcount = 1 |
                                              +--------------+
                                              | keys & vals  |
                                              +--------------+

El array original es liberado automáticamente puesto que su contador de referencias alcanza cero. Las estructuras de los contadores de los elementos alcanzan cero:

+--------------+                              +--------------+
| array ref    |                              | hash ref     |
+--------------+                              +--------------+
| refcount = 1 |                              | refcount = 1 |
+--------------+                              +--------------+
|           o  |                              |           o  |
+---------- : -+                              +---------- : -+
            :                                             :
            :                                             :
            V                                             :
+--------------+       +--------------+                   :
| array        |       | hash ref     |                   :
+--------------+       +--------------+                   :
| refcount = 1 |       | refcount = 0 |                   V
+--------------+       +--------------+       +--------------+
| no elements  |       |           o========> | hash         |
+--------------+       +--------------+       +--------------+
                                              | refcount = 2 |
                                              +--------------+
                       +--------------+       | keys & vals  |
                       | hash ref     |       +--------------+
                       +--------------+   
                       | refcount = 0 |   
                       +--------------+       +--------------+
                       |           o========> | hash         |
                       +--------------+       +--------------+
                                              | refcount = 1 |
                                              +--------------+
                                              | keys & vals  |
                                              +--------------+

Los contadores de referencias de los hashes alcanzan cero y son liberados. Ahora el contador del antiguo segundo elemento alcanza cero:

+--------------+                              +--------------+
| array ref    |                              | hash ref     |
+--------------+                              +--------------+
| refcount = 1 |                              | refcount = 1 |
+--------------+                              +--------------+
|           o  |                              |           o  |
+---------- : -+                              +---------- : -+
            :                                             :
            :                                             :
            V                                             :
+--------------+                                          :
| array        |                                          :
+--------------+                                          :
| refcount = 1 |                                          V
+--------------+                              +--------------+
| no elements  |                              | hash         |
+--------------+                              +--------------+
                                              | refcount = 1 |
                                              +--------------+
                                              | keys & vals  |
                                              +--------------+
                                             
                                             
                                              +--------------+
                                              | hash         |
                                              +--------------+
                                              | refcount = 0 |
                                              +--------------+
                                              | keys & vals  |
                                              +--------------+

y es liberado:

+--------------+                              +--------------+
| array ref    |                              | hash ref     |
+--------------+                              +--------------+
| refcount = 1 |                              | refcount = 1 |
+--------------+                              +--------------+
|           o  |                              |           o  |
+---------- : -+                              +---------- : -+
            :                                             :
            :                                             :
            V                                             :
+--------------+                                          :
| array        |                                          :
+--------------+                                          :
| refcount = 1 |                                          V
+--------------+                              +--------------+
| no elements  |                              | hash         |
+--------------+                              +--------------+
                                              | refcount = 1 |
                                              +--------------+
                                              | keys & vals  |
                                              +--------------+

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19