Introducción a Perl - 3
Matrices o Arrays
Los Arrays son básicamente un conjunto de datos almacenados en una sola variable. A diferencia de las escalares, donde se almacena un único valor, los Arrays o Matrices contienen muchos valores diferentes. Tanto es así, que dentro de un Array se pueden almacenar tanto Escalares como otros Arrays (pero esto lo dejaremos para más adelante)
Las variables de tipo Array se identifican con el símbolo: «@«
Un ejemplo:
1
|
@semana_laboral = ("Lunes","Martes","Miercoles","Jueves","Viernes");
|
Los elementos en una matriz se comienzan a numerar desde 0. Para referenciarnos a un único valor de la matriz, lo llamamos utlizando el simbolo de Escalar ($) y el número de su índice. Por lo tanto los elementos de nuestra matriz de ejemplo serían:
1
2
3
4
5
|
$semana_laboral[0] = "Lunes";
$semana_laboral[1] = "Martes";
$semana_laboral[2] = "Miercoles";
$semana_laboral[3] = "Jueves";
$semana_laboral[4] = "Viernes";
|
Para saber el número de elementos que tiene una matriz, lo podemos hacer de la siguiente forma:
1
2
3
4
5
6
7
8
|
@semana_laboral = ("Lunes","Martes","Miercoles","Jueves","Viernes");
$elementos = @semana_laboral;
print "Numero de elemento: $elementos\n";
-----------------------
c:\Temp>perl hello.pl
Numero de elemento: 5
|
Operaciones con Matrices
Para ver esto de forma rápida, vamos a poner unos ejemplos rápidos sobre el uso de casa operación, utilizando nuestro Array de ejemplo:
- Reverse (invertir la matriz)
1
2
3
4
5
6
|
@semana_laboral = ("Lunes","Martes","Miercoles","Jueves","Viernes");
@semana_modificada = reverse (@semana_laboral);
print "Nueva Array: @semana_modificada\n";
-----------------------------
c:\Temp>perl hello.pl
Nueva Array: Viernes Jueves Miercoles Martes Lunes
|
- Sort (ordena alfabéticamente la matriz)
1
2
3
4
5
6
|
@semana_laboral = ("Lunes","Martes","Miercoles","Jueves","Viernes");
@semana_modificada = sort (@semana_laboral);
print "Nueva Array: @semana_modificada\n";
-----------------------------
c:\Temp>perl hello.pl
Nueva Array: Jueves Lunes Martes Miercoles Viernes
|
- Pop (elimina el último elemento de la matriz)
1
2
3
4
5
6
7
8
9
|
@semana_laboral = ("Lunes","Martes","Miercoles","Jueves","Viernes");
$semana_modificada = pop (@semana_laboral);
print "Nueva Array: $semana_modificada\n";
print "Array original: @semana_laboral\n";
-------------------
c:\Temp>perl hello.pl
Nueva Array: Viernes
Array original: Lunes Martes Miercoles Jueves
|
- Push (añade elementos al final de la matriz)
1
2
3
4
5
6
|
@semana_laboral = ("Lunes","Martes","Miercoles","Jueves","Viernes");
push (@semana_laboral, "NUEVO");
print "Array original: @semana_laboral\n";
----------------
c:\Temp>perl hello.pl
Array original: Lunes Martes Miercoles Jueves Viernes NUEVO
|
- Shift (elimina el primer elemento de la matriz)
1
2
3
4
5
6
7
8
|
@semana_laboral = ("Lunes","Martes","Miercoles","Jueves","Viernes");
$semana_modificada = shift (@semana_laboral);
print "Nueva Array: $semana_modificada\n";
print "Array original: @semana_laboral\n";
----------------------------
c:\Temp>perl hello.pl
Nueva Array: Lunes
Array original: Martes Miercoles Jueves Viernes
|
- Unshift (añade elementos al principio de la matriz)
1
2
3
4
5
6
|
@semana_laboral = ("Lunes","Martes","Miercoles","Jueves","Viernes");
unshift (@semana_laboral, "NUEVO");
print "Array original: @semana_laboral\n";
---------------------
c:\Temp>perl hello.pl
Array original: NUEVO Lunes Martes Miercoles Jueves Viernes
|
Split
Se utiliza split para dividir una cadena larga (escalar), en secciones más pequeñas, conformando una matriz.
1
|
@matriz = split("patrón",$cadena);
|
Vamos a verlo con un ejemplo práctico:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$semana_laboral = ("Lunes\nMartes\nMiercoles\nJueves\nViernes");
print $semana_laboral;
@semana = split("\n",$semana_laboral); #Creamos una matriz con los valores del escalar
print @semana;
----------------------
c:\Temp>perl hello.pl
Lunes
Martes
Miercoles
Jueves
ViernesLunesMartesMiercolesJuevesViernes
c:\Temp>
|
Join
Join es la inversa a Split, en este caso se utlizar para concatenar los diferentes elementos de una matriz, dentro de una única cadena, utilizando un patrón para diferenciarlos:
1
2
3
4
5
6
7
8
9
10
11
|
$escalar = join("patrón",@matriz);
@semana_laboral = ("Lunes","Martes","Miercoles","Jueves","Viernes");
print "@semana_laboral\n";
$semana = join("--",@semana_laboral); #Creamos un escalar con los valores de la matriz
print $semana;
-------------------------------
c:\Temp>perl hello.pl
Lunes Martes Miercoles Jueves Viernes
Lunes--Martes--Miercoles--Jueves--Viernes
|
Matrices Asociativas
Se trata de un tipo especial de Matriz. También se le conoce como Array Asociativo, o Hash. En ellos, los elementos dentro de la propia matriz son referenciados mediante otros valores, en lugar de por su posición, como se hace en las matrices normales.
Se identifican por el símbolo %
, poniendolo delante del nombre como es habitual.
Pero vamos a verlo con ejemplos:
1
2
3
4
5
6
7
8
9
10
11
12
|
#asignamos valores a una tabla hash
my %colorfruta;
$colorfruta{"verde"}="kiwi";
$colorfruta{"amarillo"}="platano";
$colorfruta{"rojo"}="sandía";
$colorfruta{"naranja"}="naranja";
print "Una fruta verde es: ".$colorfruta{"verde"}."\n";
---------------------------
c:\Temp>perl hello.pl
Una fruta verde es: kiwi
|
También se pueden definir así:
1
2
3
4
5
|
%dias=("lunes" => L,"martes" => M,"miercoles" => X,"jueves" => J,"viernes" => V,"sabado" => S,"domingo" => D);
print "La representacion del Martes es :". $dias{"martes"}." \n";
------------------------
c:\Temp>perl hello.pl
La representacion del Martes es :M
|
Podemos extraer fácilmente tanto las claves como los valores, con «keys» y «values«:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
my %colorfruta;
$colorfruta{"verde"}="kiwi";
$colorfruta{"amarillo"}="platano";
$colorfruta{"rojo"}="sandía";
$colorfruta{"naranja"}="naranja";
#vemos las CLAVES Keys
@keys = keys(%colorfruta);
print "Claves: @keys\n";
#Vemos los VALORES Values
@values = values(%colorfruta);
print "Valores: @values\n";
----------------------
c:\Temp>perl hello.pl
Claves: verde amarillo naranja rojo
Valores: kiwi platano naranja sandia
|
Manejo de Ficheros
La entrada estándar (por teclado) corresponde a «». Esto se suele abreviar utilizando simplemente «<>«
Se suele utilizar chomp para eliminar cualquier intro o carácter extraño al final de la cadena introducida.
Como siempre, vamos a verlo más claro con un ejemplo:
1
2
3
4
5
6
7
8
9
|
print "Hola. Dime cuantos años tienes";
$edad = <STDIN>;
chomp($edad);
print "Has dicho que tienes $edad años!";
-----------------------
c:\Temp>perl hello.pl
Hola. Dime cuantos años tienes
20
Has dicho que tienes 20 años!
|
Abrir, leer, modificar y cerrar ficheros
Para operar con un fichero, primero es necesario abrirlo asociándolo con un FILEHANDLE. Vamos a explicarlo gráficamente:
1
2
3
4
5
|
open (FILE, "fichero.txt");
@array = <FILE>;
close(FILE);
print @array
open (FILE, "fichero.txt");
|
Esto abre el fichero. en este caso el fichero está en el mismo path que nuestro script, pero se podría indicar la ruta absoluta: «c:\tmp\fichero.txt«
Es una buena práctica utilizar la función «or die«. De esta forma si el fichero no existe, se genera un error. Por ejemplo:
1
2
|
open (FILE, "fichero.txt") or die "ERROR: No se encuentra el fichero.";
@array = ;
|
Con esto volcamos el contenido del fichero en un array que se llama «array».
Como ya hemos terminado con el fichero, lo cerramos. Perl lo haría automáticamente, pero es una buena práctica para evitar sorpresas inesperadas.
imprimos el array
Al igual que con la redirección estándar, podemos utilizar «>» o «»» para añadir contenido a un fichero.
- «>» Se crear un nuevo fichero en el que escribir (si existe se vacía).
1
2
3
4
5
6
7
|
open (FILE, ">fichero.txt");
$string = <FILE>;
print FILE "Hello, world!";
close(FILE);
-----------------------
c:\Temp>type fichero.txt
Hello, world!
|
- «»» Se añade el contenido al final del fichero.
1
2
3
4
5
6
7
8
|
open (FILE, ">>fichero.txt");
$string = <FILE>;
print FILE "ADIOS!!!!";
close(FILE);
--------------------------
c:\Temp>type fichero.txt
Hello, world!
ADIOS!!!!
|