Perl - Referencias

Una referencia de Perl es un tipo de datos escalares que contiene la ubicación de otro valor que podría ser escalar, matrices o hashes. Debido a su naturaleza escalar, se puede usar una referencia en cualquier lugar, se puede usar un escalar.

Puede construir listas que contengan referencias a otras listas, que pueden contener referencias a hashes, etc. Así es como se construyen las estructuras de datos anidadas en Perl.

Crear referencias

Es fácil crear una referencia para cualquier variable, subrutina o valor prefijándola con una barra invertida de la siguiente manera:

$scalarref = \$foo;
$arrayref  = \@ARGV;
$hashref   = \%ENV;
$coderef   = \&handler;
$globref   = \*foo;

No puede crear una referencia en un identificador de E / S (identificador de archivo o identificador de directorio) usando el operador de barra invertida, pero se puede crear una referencia a una matriz anónima usando los corchetes de la siguiente manera:

$arrayref = [1, 2, ['a', 'b', 'c']];

De manera similar, puede crear una referencia a un hash anónimo utilizando las llaves de la siguiente manera:

$hashref = {
   'Adam'  => 'Eve',
   'Clyde' => 'Bonnie',
};

Se puede crear una referencia a una subrutina anónima usando sub sin un subnombre de la siguiente manera:

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

Desreferenciar

La desreferenciación devuelve el valor de un punto de referencia a la ubicación. Para eliminar la referencia de una referencia, simplemente use $, @ o% como prefijo de la variable de referencia dependiendo de si la referencia apunta a un escalar, matriz o hash. A continuación se muestra el ejemplo para explicar el concepto:

#!/usr/bin/perl

$var = 10;

# Now $r has reference to $var scalar.
$r = \$var;

# Print value available at the location stored in $r.
print "Value of $var is : ", $$r, "\n";

@var = (1, 2, 3);
# Now $r has reference to @var array.
$r = \@var;
# Print values available at the location stored in $r.
print "Value of @var is : ",  @$r, "\n";

%var = ('key1' => 10, 'key2' => 20);
# Now $r has reference to %var hash.
$r = \%var;
# Print values available at the location stored in $r.
print "Value of %var is : ", %$r, "\n";

Cuando se ejecuta el programa anterior, produce el siguiente resultado:

Value of 10 is : 10
Value of 1 2 3 is : 123
Value of %var is : key220key110

Si no está seguro acerca de un tipo de variable, entonces es fácil saber su tipo usando ref, que devuelve una de las siguientes cadenas si su argumento es una referencia. De lo contrario, devuelve falso -

SCALAR
ARRAY
HASH
CODE
GLOB
REF

Probemos con el siguiente ejemplo:

#!/usr/bin/perl

$var = 10;
$r = \$var;
print "Reference type in r : ", ref($r), "\n";

@var = (1, 2, 3);
$r = \@var;
print "Reference type in r : ", ref($r), "\n";

%var = ('key1' => 10, 'key2' => 20);
$r = \%var;
print "Reference type in r : ", ref($r), "\n";

Cuando se ejecuta el programa anterior, produce el siguiente resultado:

Reference type in r : SCALAR
Reference type in r : ARRAY
Reference type in r : HASH

Referencias circulares

Una referencia circular se produce cuando dos referencias contienen una referencia entre sí. Debe tener cuidado al crear referencias, de lo contrario, una referencia circular puede provocar pérdidas de memoria. A continuación se muestra un ejemplo:

#!/usr/bin/perl

 my $foo = 100;
 $foo = \$foo;
 
 print "Value of foo is : ", $$foo, "\n";

Cuando se ejecuta el programa anterior, produce el siguiente resultado:

Value of foo is : REF(0x9aae38)

Referencias a funciones

Esto puede suceder si necesita crear un manejador de señales para poder producir una referencia a una función anteponiendo el nombre de la función con \ & y para eliminar la referencia a esa referencia, simplemente necesita prefijar la variable de referencia usando y comercial &. A continuación se muestra un ejemplo:

#!/usr/bin/perl

# Function definition
sub PrintHash {
   my (%hash) = @_;
   
   foreach $item (%hash) {
      print "Item : $item\n";
   }
}
%hash = ('name' => 'Tom', 'age' => 19);

# Create a reference to above function.
$cref = \&PrintHash;

# Function call using reference.
&$cref(%hash);

Cuando se ejecuta el programa anterior, produce el siguiente resultado:

Item : name
Item : Tom
Item : age
Item : 19