GNU/Linux >> Tutoriales Linux >  >> Linux

Tutorial de referencia y desreferenciación de matrices de Perl con ejemplos prácticos

En este artículo, revisemos cómo hacer referencia y desreferenciar matrices de Perl con ejemplos. La referencia no es más que la ubicación (dirección) de otra variable. Las referencias pueden ser de matriz, hash o un fragmento de código Perl. Las referencias hacen que el código Perl se ejecute más rápido.

Referencia de Perl a matriz

Normalmente, almacenamos la lista de elementos en una matriz como se muestra a continuación.

@array =  (“one”,”two”,”three”,”four”,”five”);

Para asignar una referencia de matriz a una variable, use el operador de barra invertida (\) como se muestra a continuación

$array_ref = \@array;

Si intenta imprimir la variable $array_ref, obtendrá algo como lo siguiente.

ARRAY(0x1a2b3c)

La referencia de matriz de Perl también se puede pasar a una subrutina como se muestra a continuación.

sub add_numbers
{
  my $array_ref =  shift;
  .....
}  

@numbers = (11,2,3,45);

$array_ref = add_numbers(\@numbers);

En el fragmento de código anterior, necesitamos desreferenciar la matriz para que la subrutina pueda tomar los elementos de la matriz original.

Las siguientes son algunas de las ventajas de pasar la referencia a una subrutina, en lugar de pasar la matriz completa.

  • Si pasamos la matriz a una subrutina, Perl copia la matriz completa en la variable @_. Cuando la matriz es grande, este no es un método efectivo.
  • Cuando queremos que la subrutina modifique el arreglo original, necesitamos pasar la referencia del arreglo.
  • Las referencias juegan un papel esencial en la construcción de estructuras de datos complejas.

Podemos tomar la referencia de una matriz anónima en la variable escalar como se muestra a continuación.

$array_ref = [ 11,2,3,45];

Nota:este artículo forma parte de la serie de tutoriales de Perl en curso.

Matriz de desreferenciación de Perl

Dentro de la subrutina, la desreferenciación se puede realizar mediante uno de los métodos que se muestran a continuación.

La variable de referencia se puede desreferenciar como se muestra a continuación. Usando este método, podemos tomar todos los elementos de la matriz. Esto es lo mismo que @numbers.

@{ $array_ref };

Para obtener un elemento particular en una matriz, haga lo siguiente. Esta declaración proporciona el primer elemento de la matriz @numbers. Esto es lo mismo que $números[0]

$ { $array_ref }[0]

En lugar de almacenar la referencia en la variable, se puede acceder a los elementos de la matriz directamente desde la variable integrada de Perl.

# Get all the elements of @numbers array.
@ { $_[0] }

# Get a particular element. This gives the first element of the array.
$ { $_[0] } [0]

Nota: Si estamos desreferenciando una variable escalar simple, entonces podemos omitir las llaves como se muestra a continuación.

@$array_ref  # same as @{ $array_ref }

$$array_ref  # same as $ { $array_ref }

$_[0]         # not a simple scalar variable and this cant be dereferenced,

Almacenamiento de múltiples referencias en la matriz Perl

Usemos el siguiente fragmento de código Perl de muestra.

#Array contains source ip and destination ip
@IP = ('192.168.1.10','192.168.1.15'); 

#Array contains the source port and destination port numbers
@PORT = ("5000","5002"); 

#Sublayers of TCP layer
@TCP = ("Q931","H225","H245"); 

#Common layers are available in a TCP packet.
@LAYER = ("ETHERNET","IP",\@TCP); 

@PKT = (
         \@IP,
         \@PORT,
         \@LAYER
        );
#Storing the reference of @PKT array into the scalar variable.
$array_ref = \@PKT;

Para comprender la referencia de la matriz, supongamos que desde el fragmento de código anterior, queremos acceder a la segunda subcapa ("H225") de la capa TCP. Esto se puede hacer como se explica a continuación.

Primero, tenemos que acceder a la matriz LAYER. Esto devuelve una referencia de la matriz @LAYER.

$ { $array_ref } [2]

$array_ref es una variable escalar simple. Por lo tanto, se pueden omitir las llaves y también se puede escribir como se muestra a continuación.

$$array_ref[2]

A continuación, para acceder al tercer elemento/capa (desde @LAYER) a través de esta referencia.

$ { $ { $array_ref } [2] } [2]

Esto devuelve la dirección de la matriz @TCP.

Finalmente, podemos obtener la segunda subcapa de la capa TCP (de la matriz @TCP) como se muestra a continuación.

$ { $ { $ { $array_ref } [2] } [2] } [1]

Lo anterior parece bastante complicado y reduce la modularidad del código. Hay una disposición para reescribir las declaraciones anteriores y lo hace más fácil a la vista de la siguiente manera.

En Perl, $ { VAR } [ $y] se puede escribir como VAR->[$y].

$ { $array_ref } [2]  is same as $array_ref->[2]

$ { $ { $array_ref } [2] } [2] is same as $array_ref->[2]->[2]

$ { $ { $ { $array_ref } [2] } [2] } [1] is same as $array_ref->[2]->[2]->[1]

Ahora, usando la regla de la "flecha para soltar", podemos reescribirla como se muestra a continuación. De acuerdo con la regla de "soltar flecha", no podemos eliminar la primera flecha. Esto es mucho más fácil de leer.

$array_ref->[2][2][1]

Linux
  1. Tutorial de comandos de expansión y desexpansión con ejemplos

  2. Matrices bash con ejemplos

  3. Tutorial de Awk:Entienda las Variables de Awk con 3 Ejemplos Prácticos

  4. Arreglos AWK explicados con 5 ejemplos prácticos

  5. Comando Echo con Ejemplos Prácticos

10 ejemplos prácticos de expresiones regulares con grep

Tutorial de Unix Sed:operación de archivos de varias líneas con 6 ejemplos prácticos

Tutorial de introducción a Bash Scripting con 5 ejemplos prácticos

Tutorial de variables Bash:6 ejemplos prácticos de variables locales y globales de Bash

El tutorial Ultimate Tar Command con 10 ejemplos prácticos

Tutorial de funciones de Bash Shell con 6 ejemplos prácticos