4. MATRICES

4.1. Matrices @

Se definen con el símbolo @ como primer carácter para diferenciarlas de las variables escalares. Contienen listas de objetos que no tienen que ser del mismo tipo.

Ejemplos:

@frutas = ("manzana", "pera", "plátano")
@diameses = (31,28,31,30,31,30,31,31,30,31,30,31)
@detounpoco = ("manzana", 31, @frutas, $eltiempo)

Estudia el siguiente ejemplo (matrices.pl):

# Define la matriz @fruta con tres elementos
@fruta = ("manzana","pera","platano");
print @fruta[0]; # Muestra el primer elemento
print @fruta[1]; # Muestra el segundo elemento
print @fruta[2]; # Muestra el último elemento

# Agrega otra fruta al final de la lista
@fruta[3] = "Melón";

# Agrega otra fruta al final de la lista (de otra forma)
push(@fruta, "kiwi");

#¿Los vemos todos juntitos?
print "\n"; # Esto para insertar una línea nueva
print @fruta; # Y esto para verlos juntitos...

# Creamos una nueva tabla.
@dias= (1,2,3,4,5,6,7);

# Agregamos la tabla dias como último elemento de la de frutas ¡Es posible!
push(@fruta, @dias);

print "\n"; # Esto ya sabes para que es.
print @fruta; # ¿Y esto que hará? ¡Qué bárbaro!

print "\n"; # Ni te lo cuento para que sirve.
print "@fruta"; # ¡Es el colmo! Separa los elementos con un espacio

print "\n"; # ...ZZZZ.zzzz....
print @fruta[5,3]; # Esto visualiza 1Melón.

Las líneas anteriores se encuetran en (matrices.pl).

Un ejemplo trabajando con los elementos de una matriz (matrice2.pl):

# Trabajando con los elementos de una matriz.

@matriz = ("enero", "febrero", "marzo"); #Define @matriz con 3 meses.
$elementos = @matriz; #Lee el número total de elementos que es 3.
$ultimo = @#matriz; #Lee el número del último elemento que es 2.
print @matriz, "\n";
print $elementos, "\n";
print $ultimo, "\n";

4.2. Matrices asociativas.

Una matriz asociativa está indexada por cadenas en lugar de por números. Se utiliza % para definir el tipo de matriz asociativa y un elemento está indexado por el anterior formando ambos parejas del tipo indice=valor.

Un ejemplo sencillo con una matriz asociativa (matrasoc.pl):

%campos = ("nombre", "Ana", "calle", "Andalucia 1", "edad", "56");
$tunombrees = $campos{"nombre"}; #Es "ana"
$tucallees = $campos{"calle"}; #Es "Andalucia 1"
$tuedades = $campos{"edad"}; #Es "56"
$tutodoes = $tunombrees." de ".$tucallees." con ".$tuedades." años";

print $tutodoes; #Ana de Andalucia 1 con 56 años

$campos{"sexo"} = "mujer"; #Añade el campo sexo con el dato mujer
$tusexoes = $campos{"sexo"}; #Es "mujer"

$tutodoes = $tutodoes." y es ".$tusexoes;

print "\n";
print $tutodoes; #Ana de Andalucia 1 con 56 años y es mujer

Un ejemplo para pasar una matriz @ en una matriz %:

@articulos = ("X", "Martillo", "Y", "Alicates", "Z", "Tenazas")
%inventario = @articulos;
print $inventario{"X"}; # Martillo
print $inventario{"Y"}; # Alicates
print $inventario{"Z"}; # Tenazas

4.3. Foreach(), Keys() y Each().

Ejemplo usando foreach para recorrer los elementos de una matriz hasta el final, la función keys() para acceder a los índices de una matriz asociativa y también la función each() que se presenta como la forma más lógica de acceder a los índices y a los valores de una matriz asociativa (matrasc2.pl):

# Recorre e imprime una matriz @ con foreach.

@meses = ("I", "ene", "II", "feb", "III", "mar");
foreach (@meses) {
print; #Imprime: IeneIIfebIIImar
}
print "\n";

# Ahora dejando un espacio en blanco entre los elementos.

foreach $lee (@meses) {
print $lee, " "; #Imprime: I ene II feb III mar
}
print "\n";

# Ahora crea una matriz % de una matriz @.

%mensualidades = @meses;

# Ahora usa keys() para leer los elementos indices de una matriz %
# que los almacena en la matriz @indices. Luego los imprime.

@indices = keys(%mensualidades);
print "@indices"; #Imprime: I II III
print "\n";

# Otra forma de imprimir los indices pero usando foreach

foreach $lee (keys(%mensualidades)) {
print $lee, " ";
}
print "\n";

# Por último hacemos con la matriz % lo que hicimos con la @,
# es decir, recorrerla toda pero accediendo por índices con keys().

foreach $lee (keys(%mensualidades)) {
print $lee, " --> ", $mensualidades{$lee}, " ";
}
print "\n";

# Imprime I --> ene II --> feb III --> mar

# Podemos recorrer una matriz asociativa con un bucle while() y
# usando la función each(). Each lee cada pareja de una vez así:

while (($indice, $valor) = each(%mensualidades)) {
print $indice, "=", $valor, "\n";
}

# Imprime I=ene II=feb III=mar

4.4. Split().

Usar Split() para convertir cadenas en listas de datos.

# Un ejemplo de Split() para convertir cadenas en listas

$cadena= "empresa=Donuts&producto=Donettes&precio=100";

@tabla = split(/&/, $cadena); #Divide la cadena usando &

print $tabla[0], "\n"; #empresa=Donuts
print $tabla[1], "\n"; #producto=Donettes
print $tabla[2], "\n"; #precio=100

# Split con $_

$_ = "Mañana vienen los Reyes Magos";

print "\n";
@reyes = split;
foreach $lee (@reyes) {
print $lee, "__"; #Mañana__vienen__los__Reyes__Magos__
}

4.5. Join().

La función Join() agrupa todos los elementos de una matriz dentro de una cadena y conecta los elementos con un delimitador específico.

Ejemplo:

$Union = "=";
@Frutas = ("Paco", "Curro", "Francisco");
$cadena = join($Union, @Frutas);
Print $cadena; # cadena = "Paco=Curro=Francisco"

4.6. Hex() y Pack().

Hex() convierte un número en base 10 a base 16 y Pack() es un convertidor de tipos que ofrece varias opciones de conversión. La función Pack toma dos parámetros para realizarlo: una plantilla, o instrucción para el tipo de conversión a realizar, y una lista de números decimales para convertir. Estas dos funciones son muy útiles para convertir datos procedentes de formularios de Web. Todos los caracteres de control, de puntuación y signos llegan en formato hexadecimal al servidor y necesitan convertirse al formato ASCII.

Plantillas y Tipo de número
"c" Carácter con signo (más o menos) -127 a 127.
"C" Carácter sin signo desde 0 a 255 (Formato ASCII).
"i" Entero con signo desde -16383 a +16383.
"I" Entero son signo desde 0 a 32767.

Ejemplos:

$letra = pack("C", 65); #Convierte 65 en un carácter ASCII
print $letra; #Imprime la letra A

$letra = hex(41); #Convierte 41 en hex a 65 en decimal
print pack("C", $letra);#Imprime también la letra A

$crlf = pack("CC", hex("0D"), hex("0A")); #Salto de línea
print $crlf; #Salto de línea es igual que "\n"

4.7. Chop().

Concatena cadenas eliminando el carácter de nueva línea.

Perl ajusta la función chop para cada plataforma. En UNIX, la nueva línea es 10 ASCII (el \n de Perl); en Mac es 13 ASCII; y en DOS (y Windows), es 13 ASCII más 10 ASCII. Tanto si consta de uno o de dos caracteres, en cada caso, chop elimina el carácter o caracteres de nueva línea.

Ejemplo (chop.pl):

while (<STDIN>) {
chop($_);
$linea .= $_;
print $linea,"\n";
}

4.8. Index().

Busca la situación de una subcadena dentro de una cadena.

Sintaxis: index($Cadena, $Subcadena [,Desplazamiento])

$cadena es la cadena dónde se busca la $subcadena y Desplazamiento es opcionalmente el número de caracteres desde el inicio que se ignoran en la búsqueda.

Ejemplo:

$posicion = index("Las bicicletas son para el verano","bici");
print $posicion; # $posicion = 4

$posicion almacena el número de posición de comienzo de la subcadena dentro de la cadena, teniendo en cuenta que el primer caracter de la cadena es la posición cero. Si el resultado es -1 no se ha encontrado la subcadena.

4.9. Rindex().

Busca hacia atrás la situación de una subcadena dentro de una cadena.

Sintaxis: rindex($cadena, $subcadena [,Desplazamiento])

$cadena es la cadena dónde se busca la $subcadena y Desplazamiento es opcionalmente el número de caracteres desde el inicio que se ignoran en la búsqueda.

Ejemplo:

$posicion = rindex("Las bicicletas son para el verano","bici");
print $posicion; # $posicion = 4

4.10. Length().

Lenght() devuelve la longitud de una cadena.

Ejemplo:

$longitud = length("Las bicicletas");
print $longitud; # $longitud = 14

4.11. Substr().

Devuelve una subcadena extrayéndola de una cadena partiendo de una posición inicial y una longitud determinadas.

Sintaxis: $subcadena = substr($cadena, inicio [,longitud])

Ejemplo:

$subcadena = substr("Las bicicletas", 5, 4);
print $subcadena; # $subcadena = "bici"

4.12. Push(), Unshift(), Pop(), Shift() y Delete().

Push() Añade elementos al final de una matriz.
Unshift() Añade elementos al principio de una matriz desplazando
el resto de elementos una posición hacia atrás.
Pop() Elimina elementos al final de una matriz.
Shift() Elimina elementos al principio de una matriz desplazando
el resto de elementos una posición hacia delante.
Delete() Elimina elementos en una matriz asociativa.

Ejemplo
(matrice3.pl):

# Agregar y eliminar elementos en una matriz

@matriz = ("uno", "dos", "tres"); #Define matriz con tres elementos
push(@matriz, "cuatro"); #Añade al final un cuarto elemento
print "@matriz", "\n"; #Visualiza uno dos tres cuatro
unshift(@matriz, "cero"); #Añade al principio el elemento "cero"
print "@matriz", "\n"; #Visualiza cero uno dos tres cuatro
$elemento = pop(@matriz); #Devuelve y elimina el último elemento
print $elemento, "\n"; #Visualiza cuatro
print "@matriz", "\n"; #Visualiza cero uno dos tres
$elemento = shift(@matriz); #Devuelve y elimina el primer elemento
print $elemento, "\n"; #Visualiza cero
print "@matriz", "\n"; #Visualiza uno dos tres
%romano = ("I","uno","II","dos"); #Crea la matriz asociativa romano
print %romano, "\n"; #Visualiza IunoIIdos
$borrar = delete $romano{"I"}; #Elimina la pareja Iuno
print $borrar, "\n"; #Visualiza uno
print %romano, "\n"; #Visualiza IIdos

4.13. Sort() y Reverse().

Sort ordena los elementos de una matriz.

Ejemplo (matrice4.pl):

@Matriz = ("d","a","c","b");
@Ordenada = Sort(@Matriz);
print "@Ordenada"; #Visualiza a b c d

Reverse invierte el orden de los elementos de una matriz.

Ejemplo:

@Matriz = ("a","b","c","d");
@Invertida = Reverse(@Matriz);
print "@Invertida"; #Visualiza d c b a

4.14. Values().

Visualiza los elementos valores de una matriz asociativa.

Ejemplo (values.pl):

%lenguajes = ( 1, "HTML", 2, "PERL", 3, "JAVA", 4, "JAVASCRIPT");
print values(%lenguajes), "\n"; #Visualiza HTMLPERLJAVAJAVASCRIPT

4.15. Die().

La función die() cuando se realiza una operación de acceso a un archivo, y ésta produce un error, termina inmediatamente la ejecución del programa y envía un mensaje de error a STDERR (la salida estándar para los errores). Es el último recurso que se tiene para informar de que algo ha ido mal.

Se suele usar conjuntamente con el operador especial or-else (o de lo contrario) que se representa con dos barras verticales ||. Delante de la primera barra se indica qué hacer y después de la segunda qué hacer en caso de no realizarse lo primero.

Ejemplo (die.pl):

open (FHANDLE, "saludo.txt") || die "No puedo abrir archivo";
open (FHANDLE, "saludi") || die "No puedo abrir saludi";

die ("Ya he terminado de trabajar.");

4.16. Grep().

Grep busca coincidencias de modelos en una matriz.

Sintaxis:

@encontrado = grep(/expresión/, matriz);

@encontrado contendrá la lista de coincidencias.

Ejemplo (grep.pl):

# Con la función grep() podemos buscar enlaces del tipo http://www...
# en una tabla.

@lista = ("Enlace 1: http://www.u.es ","texto","Enlace 2: http://www.d.es ");

# @enlaces almacena los elementos de @lista donde existe un enlace.

@enlaces = grep(/http:\/\/www\..* /i, @lista);

# Visualiza los elementos donde existe un enlace.

$numenlaces = @enlaces;
print "\n";
print "Número de enlaces: ", $numenlaces, "\n";
print "--------------------\n";
foreach $Encontrado (@enlaces) {
print "$Encontrado\n";
}

# Visualiza sólo los enlaces omitiendo el texto a derecha e izquerda.

print "\n";
print "Muestra sólo los enlaces:\n";
print "-------------------------\n";
foreach $_ (@lista) {
print $&."\n" if /http:\/\/www\..* /i;
}