.. | .. |
![]() |
PERL |
Conociendo matrices (arrays) |
by alfi
El conocimiento de matrices en cualquier lenguaje de programación es de suma utilidad.
Las matrices o Arrays son grupos de datos acumulados en una simple variable.
En tanto que las variables llamadas scalar (son scalar aquellas que empiezan con $, ejemplo $valor), sólo pueden almacenar un solo valor, las matrices (son matrices las que empiezan con @, ejemplo @valor) pueden almacenar muchos.
Un ejemplo de matriz simple, es la que contiene los dias de la semana:
@days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
Fijese que cada dia de la semana esta entrecomillado y separado del siguiente con una coma.
#!/usr/bin/perl
@days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
print "Content-type: text/html\n\n";
print "These are the days of the week: ";
print "@days";
Usando comillas, los scripts traspasan la información y los contenidos de una matriz son impresos con un espacio entre cada uno de ellos.
Sin embargo, a veces resulta util que los elementos de una matriz no esten delimitados por comillas, en cuyo caso deberemos eliminarlas usando el argumento qw.
@days = qw(Monday Tuesday Wednesday Thursday Friday Saturday Sunday);
En esta linea, los elementos de la matriz no tienen ni entrecomillado(") ni comas (,)
Sus elementos están separados por espacios
Las matrices son capaces de contener otras variables como scalars ($) y otras matrices (@)
Al igual que Visual Basic y JavaScript entre otros lenguajes, PERL en sus matrices comienza a numerar los elementos desde el cero 0, en lugar de 1.
Una matriz de diez elementos, tendrá numerados sus elementos asi: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Si vemos cuidadosamente al empezar desde el cero, los diez elementos finalizan en el 9 !!!
Si continuamos con la matriz de los dias @days, para imprimir el cuarto elemento debemos hacer lo siguiente:
print "El valor del cuarto elemento de la matriz es $days[3]";
Nótese que se generó un concepto nuevo $days[3]
Cada elemento de la matriz se puede analizar por separado usando el mismo nombre de la matriz, pero con el signo $ delante en lugar del signo @. Asi de este modo, haremos referencia solo y exclusivamente a un elemento de esa matriz cuyo nombre es igual al de la variable scalar que estamos escribiendo.
Por otra parte, para hacer referencia al cuarto elemento de la matriz @days, deberemos escribir $days[3] ya que el primer elemento es el $days[0] !!!
Los siete elementos de la matriz son entonces:
$days[0] = "Monday";
$days[1] = "Tuesday";
$days[2] = "Wednesday";
$days[3] = "Thursday";
$days[4] = "Friday";
$days[5] = "Saturday";
$days[6] = "Sunday";
Si quisieramos saber el numero de elementos de una matriz y asignarlo a una variable scalar, es facil hacerlo, en el caso de la matriz @days el numero de elementos se analiza asi:
$days = @days; ## esto nos dice el indice del último elemento
Pero para conocer la cantidad de elementos exacta deberemos agregar 1 ya que el primer indice es igual a cero
$days = @days+1;
Ahora una curiosidad, que sucedería si en lugar de escribir $days[3], con lo cual ya sabemos que obtendremos el cuarto elemento de la matriz el cual es THURSDAY, escribimos esto otro:
$days[-4];
PERL, comenzará a contar cuatro elementos desde el final, con lo cual en este ejemplo de @days, obtendremos tambien THURSDAY
Por lo tanto el último elemento de una matriz es -1
Otras curiosidades, por ejemplo usted quiere conocer el primer elemento de una matriz y asignarlo a una variable scalar ($)
($result)=@days;
Naturalmente tambien podemos hacer $result = $days[0];
Si queremos asignar los dos primeros elementos de una matriz a variables de tipo scalar podemos hacer:
($result1,$result2)=@days;
También en este caso podemos hacer $result1 = $days[0]; $result2 = $days[1];
OPERACIONES DE ADICION DE ELEMENTOS EN UNA MATRIZ
Para copiar una matriz en otra es tan facil como hacer la asignación:
@array1 = @array2;
Para agregar un nuevo valor al comienzo de una matriz, usaremos el comando UNSHIFT
$elemento="nuevo_elemento";
unshift(@array,$elemento);
Pero también el mismo efecto se obtiene haciendo lo siguiente:
$elemento="nuevo_elemento";
@array=($elemento,@array);
Para agregar un nuevo valor al final de la matriz haremos cualquiera de las siguientes opciones:
push(@nueva,$ary1[$gg]); ## Aqui agregas un vector a la matriz
push(@nueva,$nuevoelemento); ## Aqui agregas una variable a la matriz
Si queremos combinar dos matrices en una nueva, haremos lo más simple:
@newarray=(@firstarray,@secondarray);
OPERACIONES DE SUSTRACCIÓN DE ELEMENTOS EN UNA MATRIZ
Para eliminar el primer elemento de una matriz haremos lo siguiente:
$result=shift(@array);
Hemos removido de la matriz el primer elemento y lo hemos guardado en una variable scalar.
Para eliminar el último elemento de una matriz:
$result=pop(@array);
OPERACION DE REEMPLAZO DE UN ELEMENTO DE LA MATRIZ
Para reemplazar un elemento de la matriz haremos
$array[3]=$newelement;
En éste caso hemos reemplazado el tercer elemento de la matriz con el valor de la variable scalar $newelement
ORDENAMIENTO DE LOS ELEMENTOS DE UNA MATRIZ
Para ordenar una matriz en orden alfabético (según el codigo ASCII):
@array=sort(@array);
Para ordenarla en sentido inverso del alfabeto, es un poco más complejo:
sort {$b cmp $a} (@array);
Para ordenar una matriz en orden numérico ascendente:
sort {$a <=> $b} (@array);
Para ordenar una matriz en orden numerico descendente:
sort {$b <=> $a} (@array);
Para imprimir una matriz ordenadamente sin alterar la matriz original:
print sort(@array);
Para revertir el orden de los elementos de una matriz, poniendo el último en primer lugar y asi sucesivamente:
reverse (@array);
ACCESO MULTIPLE: dos o más elementos de una matriz son accedidos simultáneamente
@values = @array[0,3,4];
Fijese que el valor se acumula en una matriz, ya que es más de un solo dato, si pusieramos una variable tipo scalar, solo almacenaria el primer dato de todos los seleccionados.
En la nueva matriz los elementos estarán indexados ordenadamente y no como ocurre en el ejemplo 0,3,4
Pero si queremos generar una matriz donde los elementos traspasados estén ordenados igual a como lo estaban en la matriz original, deberemos hacer:
@values[0,3,4] = @days[0,3,4];
Otra manera es:
@array[0,3,4] = ("Hello","Out","There");