Perl: matrices

Una matriz es una variable que almacena una lista ordenada de valores escalares. Las variables de matriz están precedidas por un signo "arroba" (@). Para hacer referencia a un solo elemento de una matriz, utilizará el signo de dólar ($) con el nombre de la variable seguido del índice del elemento entre corchetes.

Aquí hay un ejemplo simple del uso de variables de matriz:

#!/usr/bin/perl

@ages = (25, 30, 40);             
@names = ("John Paul", "Lisa", "Kumar");

print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";

Aquí hemos utilizado el signo de escape (\) antes del signo $ solo para imprimirlo. Otro Perl lo entenderá como una variable e imprimirá su valor. Cuando se ejecuta, esto producirá el siguiente resultado:

$ages[0] = 25
$ages[1] = 30
$ages[2] = 40
$names[0] = John Paul
$names[1] = Lisa
$names[2] = Kumar

En Perl, los términos List y Array se usan a menudo como si fueran intercambiables. Pero la lista son los datos y la matriz es la variable.

Creación de matrices

Las variables de matriz tienen el prefijo @ y se completan utilizando paréntesis o el operador qw. Por ejemplo

@array = (1, 2, 'Hello');
@array = qw/This is an array/;

La segunda línea usa el operador qw //, que devuelve una lista de cadenas, separando la cadena delimitada por espacios en blanco. En este ejemplo, esto conduce a una matriz de cuatro elementos; el primer elemento es 'esto' y el último (cuarto) es 'matriz'. Esto significa que puede usar diferentes líneas de la siguiente manera:

@days = qw/Monday
Tuesday
...
Sunday/;

También puede completar una matriz asignando cada valor individualmente de la siguiente manera:

$array[0] = 'Monday';
...
$array[6] = 'Sunday';

Acceso a elementos de matriz

Al acceder a elementos individuales de una matriz, debe anteponer la variable con un signo de dólar ($) y luego agregar el índice del elemento dentro de los corchetes después del nombre de la variable. Por ejemplo

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

print "$days[0]\n";
print "$days[1]\n";
print "$days[2]\n";
print "$days[6]\n";
print "$days[-1]\n";
print "$days[-7]\n";

Esto producirá el siguiente resultado:

Mon
Tue
Wed
Sun
Sun
Mon

Los índices de matriz comienzan desde cero, por lo que para acceder al primer elemento debe dar 0 como índices. También puede dar un índice negativo, en cuyo caso selecciona el elemento desde el final, en lugar del principio, de la matriz. Esto significa lo siguiente:

print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon

Matrices de números secuenciales

Perl ofrece un atajo para números y letras secuenciales. En lugar de escribir cada elemento al contar hasta 100, por ejemplo, podemos hacer algo como lo siguiente:

#!/usr/bin/perl

@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);

print "@var_10\n";   # Prints number from 1 to 10
print "@var_20\n";   # Prints number from 10 to 20
print "@var_abc\n";  # Prints number from a to z

Aquí se llama doble punto (..) range operator. Esto producirá el siguiente resultado:

1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z

Tamaño de matriz

El tamaño de una matriz se puede determinar utilizando el contexto escalar en la matriz; el valor devuelto será el número de elementos en la matriz.

@array = (1,2,3);
print "Size: ",scalar @array,"\n";

El valor devuelto siempre será el tamaño físico de la matriz, no el número de elementos válidos. Puede demostrar esto, y la diferencia entre scalar @array y $ # array, usando este fragmento es la siguiente:

#!/usr/bin/perl

@array = (1,2,3);
$array[50] = 4;

$size = @array;
$max_index = $#array;

print "Size:  $size\n";
print "Max Index: $max_index\n";

Esto producirá el siguiente resultado:

Size: 51
Max Index: 50

Solo hay cuatro elementos en la matriz que contienen información, pero la matriz tiene 51 elementos de longitud, con un índice más alto de 50.

Agregar y eliminar elementos en una matriz

Perl proporciona una serie de funciones útiles para agregar y eliminar elementos en una matriz. Es posible que tenga una pregunta ¿qué es una función? Hasta ahora has usadoprintfunción para imprimir varios valores. Del mismo modo, hay varias otras funciones o, en ocasiones, llamadas subrutinas, que se pueden utilizar para varias otras funcionalidades.

No Señor. Tipos y descripción
1

push @ARRAY, LIST

Inserta los valores de la lista al final de la matriz.

2

pop @ARRAY

Aparece y devuelve el último valor de la matriz.

3

shift @ARRAY

Desplaza el primer valor de la matriz y lo devuelve, acortando la matriz en 1 y moviendo todo hacia abajo.

4

unshift @ARRAY, LIST

Antepone la lista al principio de la matriz y devuelve el número de elementos de la nueva matriz.

#!/usr/bin/perl

# create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1. \@coins  = @coins\n";

# add one element at the end of the array
push(@coins, "Penny");
print "2. \@coins  = @coins\n";

# add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3. \@coins  = @coins\n";

# remove one element from the last of the array.
pop(@coins);
print "4. \@coins  = @coins\n";

# remove one element from the beginning of the array.
shift(@coins);
print "5. \@coins  = @coins\n";

Esto producirá el siguiente resultado:

1. @coins = Quarter Dime Nickel
2. @coins = Quarter Dime Nickel Penny
3. @coins = Dollar Quarter Dime Nickel Penny
4. @coins = Dollar Quarter Dime Nickel
5. @coins = Quarter Dime Nickel

Cortar elementos de matriz

También puede extraer un "segmento" de una matriz, es decir, puede seleccionar más de un elemento de una matriz para producir otra matriz.

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3,4,5];

print "@weekdays\n";

Esto producirá el siguiente resultado:

Thu Fri Sat

La especificación de un segmento debe tener una lista de índices válidos, positivos o negativos, cada uno separado por una coma. Para mayor velocidad, también puede utilizar el.. operador de rango -

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3..5];

print "@weekdays\n";

Esto producirá el siguiente resultado:

Thu Fri Sat

Reemplazo de elementos de matriz

Ahora vamos a introducir una función más llamada splice(), que tiene la siguiente sintaxis:

splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]

Esta función eliminará los elementos de @ARRAY designados por OFFSET y LENGTH, y los reemplazará con LIST, si se especifica. Finalmente, devuelve los elementos eliminados de la matriz. A continuación se muestra el ejemplo:

#!/usr/bin/perl

@nums = (1..20);
print "Before - @nums\n";

splice(@nums, 5, 5, 21..25); 
print "After - @nums\n";

Esto producirá el siguiente resultado:

Before - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
After - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20

Aquí, el reemplazo real comienza con el sexto número, después de eso, cinco elementos se reemplazan del 6 al 10 con los números 21, 22, 23, 24 y 25.

Transformar cadenas en matrices

Veamos una función más llamada split(), que tiene la siguiente sintaxis:

split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

Esta función divide una cadena en una matriz de cadenas y la devuelve. Si se especifica LIMIT, se divide en como máximo ese número de campos. Si se omite PATTERN, se divide en espacios en blanco. A continuación se muestra el ejemplo:

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string);
@names  = split(',', $var_names);

print "$string[3]\n";  # This will print Roses
print "$names[4]\n";   # This will print Michael

Esto producirá el siguiente resultado:

Roses
Michael

Transformar matrices en cadenas

Podemos usar el join()función para volver a unir los elementos de la matriz y formar una cadena escalar larga. Esta función tiene la siguiente sintaxis:

join EXPR, LIST

Esta función une las cadenas separadas de LIST en una sola cadena con campos separados por el valor de EXPR y devuelve la cadena. A continuación se muestra el ejemplo:

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string);
@names  = split(',', $var_names);

$string1 = join( '-', @string );
$string2 = join( ',', @names );

print "$string1\n";
print "$string2\n";

Esto producirá el siguiente resultado:

Rain-Drops-On-Roses-And-Whiskers-On-Kittens
Larry,David,Roger,Ken,Michael,Tom

Clasificar matrices

los sort()La función ordena cada elemento de una matriz de acuerdo con los estándares numéricos ASCII. Esta función tiene la siguiente sintaxis:

sort [ SUBROUTINE ] LIST

Esta función ordena la LISTA y devuelve el valor de la matriz ordenada. Si se especifica SUBROUTINE, se aplica la lógica especificada dentro de SUBTROUTINE mientras se clasifican los elementos.

#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";

# sort this array
@foods = sort(@foods);
print "After: @foods\n";

Esto producirá el siguiente resultado:

Before: pizza steak chicken burgers
After: burgers chicken pizza steak

Tenga en cuenta que la clasificación se realiza según el valor numérico ASCII de las palabras. Entonces, la mejor opción es transformar primero todos los elementos de la matriz en letras minúsculas y luego realizar la función de clasificación.

La $ [Variable especial

Hasta ahora, ha visto variables simples que definimos en nuestros programas y las usamos para almacenar e imprimir valores escalares y de matriz. Perl proporciona numerosas variables especiales, que tienen su significado predefinido.

Tenemos una variable especial, que se escribe como $[. Esta variable especial es un escalar que contiene el primer índice de todas las matrices. Debido a que las matrices de Perl tienen indexación basada en cero, $ [casi siempre será 0. Pero si establece $ [en 1, entonces todas sus matrices usarán indexación basada en. Se recomienda no utilizar ningún otro índice que no sea cero. Sin embargo, tomemos un ejemplo para mostrar el uso de $ [variable -

#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Foods: @foods\n";

# Let's reset first index of all the arrays.
$[ = 1;

print "Food at \@foods[1]: $foods[1]\n";
print "Food at \@foods[2]: $foods[2]\n";

Esto producirá el siguiente resultado:

Foods: pizza steak chicken burgers
Food at @foods[1]: pizza
Food at @foods[2]: steak

Fusionar matrices

Debido a que una matriz es solo una secuencia de valores separados por comas, puede combinarlos como se muestra a continuación:

#!/usr/bin/perl

@numbers = (1,3,(4,5,6));

print "numbers = @numbers\n";

Esto producirá el siguiente resultado:

numbers = 1 3 4 5 6

Las matrices integradas simplemente se convierten en parte de la matriz principal como se muestra a continuación:

#!/usr/bin/perl

@odd = (1,3,5);
@even = (2, 4, 6);

@numbers = (@odd, @even);

print "numbers = @numbers\n";

Esto producirá el siguiente resultado:

numbers = 1 3 5 2 4 6

Seleccionar elementos de listas

La notación de lista es idéntica a la de las matrices. Puede extraer un elemento de una matriz agregando corchetes a la lista y dando uno o más índices:

#!/usr/bin/perl

$var = (5,4,3,2,1)[4];

print "value of var = $var\n"

Esto producirá el siguiente resultado:

value of var = 1

Del mismo modo, podemos extraer porciones, aunque sin el requisito de un carácter @ inicial -

#!/usr/bin/perl

@list = (5,4,3,2,1)[1..3];

print "Value of list = @list\n";

Esto producirá el siguiente resultado:

Value of list = 4 3 2