Referencias en Perl

Una referencia es un puntero; una referencia en Perl es un tipo escalar que puede apuntar a variables, arrays, tablas hash (también llamadas arrays asociativos) e incluso subrutinas, y se puede aplicar en cualquier parte del programa.


Crear referencias

Al definir una variable, si antepones \ al nombre de la variable, obtienes una referencia a esa variable, por ejemplo:

$scalarref = \$foo;     # 标量变量引用
$arrayref  = \@ARGV;    # 列表的引用
$hashref   = \%ENV;     # 哈希的引用
$coderef   = \&handler; # 子过程引用
$globref   = \*foo;     # GLOB句柄引用

En los arrays podemos usar referencias a arrays anónimos, definidas con []:

$aref= [ 1,"foo",undef,13 ];

Los elementos de un array anónimo pueden ser a su vez arrays anónimos, por lo que con este método podemos construir arrays de arrays, y arrays de cualquier dimensión.

my $aref = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
]

En los hashes podemos usar referencias a hashes anónimos, definidas con {}:

$href= { APR =>4, AUG =>8 };

También podemos crear una referencia a una subrutina anónima sin nombre de subrutina:

$coderef = sub { print "Ejemplo!\n" };

Desreferenciar

Para desreferenciar se puede usar $, @ o % según el tipo, como en el siguiente ejemplo:

Ejemplo

#!/usr/bin/perl $var = 10; # $r referencia al escalar $var $r = \$var; # Muestra el valor de la variable a la que hace referencia $r print "$vares:", $$r, "\n"; @var = (1, 2, 3); # $r referencia al array @var $r = \@var; # Muestra el valor de la variable a la que hace referencia $r print "@var es:", @$r, "\n"; %var = ('key1' => 10, 'key2' => 20); # $r referencia al hash %var $r = \%var; # Muestra el valor de la variable a la que hace referencia $r print "\%var es:", %$r, "\n";

El resultado de ejecutar el ejemplo anterior es:

10 为 : 10
1 2 3 为: 123
\%var 为 : key110key220

Si no puedes determinar el tipo de variable, puedes usarrefpara determinarlo. La lista de valores devueltos es la siguiente; si no se encuentra entre los siguientes valores, devuelve false:

SCALAR
ARRAY
HASH
CODE
GLOB
REF

El ejemplo es el siguiente:

Ejemplo

#!/usr/bin/perl $var = 10; $r = \$var; print "Tipo de referencia de r:", ref($r), "\n"; @var = (1, 2, 3); $r = \@var; print "Tipo de referencia de r:", ref($r), "\n"; %var = ('key1' => 10, 'key2' => 20); $r = \%var; print "Tipo de referencia de r:", ref($r), "\n";

El resultado de ejecutar el ejemplo anterior es:

r 的引用类型 : SCALAR
r 的引用类型 : ARRAY
r 的引用类型 : HASH

Referencias circulares

Las referencias circulares aparecen cuando dos referencias se contienen mutuamente. Debes usarlas con cuidado, de lo contrario pueden causar fugas de memoria, como en el siguiente ejemplo:

Ejemplo

#!/usr/bin/perl my $foo = 100; $foo = \$foo; print "Value of foo is : ", $$foo, "\n";

El resultado de ejecutar el ejemplo anterior es:

Value of foo is : REF(0x9aae38)

Referencias a funciones

Formato de referencia a función: \&

Formato para llamar a una referencia de función: & + nombre de la referencia creada.

Ejemplo:

Ejemplo

#!/usr/bin/perl # Definición de la función sub PrintHash{ my (%hash) = @_; foreach $item (%hash){ print "Elemento:$item\n"; } } %hash = ('name' => 'ejemplo', 'age' => 3); # Crear una referencia a la función $cref = \&PrintHash; # Llamar a la función usando la referencia &$cref(%hash);

El resultado de ejecutar el ejemplo anterior es:

元素 : age
元素 : 3
元素 : name
元素 : ejemplo
Otras extensiones