Hasta ahora hemos visto los datos escalares, en los que el límite de almacenaje es un sólo elemento por variable. Para superar ese límite, entran en juego las listas.
Una lista o vector, es una colección ordenada de escalares (números o cadenas). A la variable que almacena una lista se le llama array.
Para definir un array, se usa el símbolo @ delante del nombre. Algunos ejemplos:
my @animals = ("camello", "llama", "búho"); my @numbers = (23, 42, 69); my @mixed = ("camello", 42, 1.23);
Para acceder a las variables que componen el array, se referencian por un índice numérico, que comienza en cero. Este índice se incluye al final de la variable entre corchetes ( [ ] ). También se cambia el símbolo @ por $, para indicar que queremos acceder al contenido de una posición del array, no al array completo.
print $animals[0]; # imprime "camello" print $animals[1]; # imprime "llama" $animals[3] = "gato" # añade un nuevo elemento a @animals
Para conocer el índice al último elemento de un array, se utiliza el nombre de la variable precedida por los símbolos $#. Por lo tanto $#array + 1 indica el número de elementos de @array (los índices están en base 0).
print $mixed[$#mixed]; # imprime el último elemento: 1.23 print $#mixed + 1; # número de elementos de @mixed: 3
Ordenando el array
Algunos operadores útiles para trabajar con arrays, son sort y reverse, que se encargan de ordenar los elementos de un array teniendo en cuenta su orden numérico o alfabético (según la tabla ASCII). Con ellos podemos hacer copias ordenadas hacia adelante o hacia atrás de los arrays:
my @ordenado = sort @animals; # igual a: búho, camello, llama my @delreves = reverse @animals; # igual a: llama, camello, búho
Usando el array como una cola
Hemos visto que los arrays son contenedores ordenados de elementos. Hasta ahora los referenciábamos por un índice. Pero hay casos en que el índice no nos sea útil, y queramos utilizar los arrays como colas.
Las colas son secuencias de elementos, en las que lo que nos interesa es el principio y el fin de la lista, sin necesitar saber qué elementos hay en las posiciones intermedias. Un ejemplo sería una cola FIFO (del inglés First In First Out), en la que el primero que llega a la cola es el primero que sale de ella.
Los siguientes comandos nos permiten poner y quitar elementos al principio y al final de un array:
Comando | Descripción |
---|---|
pop | Saca el último elemento del array |
push | Inserta un elemento al final del array |
shift | Saca el primer elemento del array |
unshift | Inserta un elemento al principio del array |
Ejemplo de uso de pop, push, shift, y unshift:
my @array = (5, 6, 7, 8, 9); $valor = pop(@array); # $valor es 9, @array es (5, 6, 7, 8) $otrov = pop @array; # $otrov es 8, @array es (5, 6, 7) pop @array; # @array es (5, 6). El 7 se descarta. push(@array, 0); # @array es (5, 6, 0) push @array, 8; # @array es (5, 6, 0, 8) my @mas = (9, 0, 2, 1); push @array, @mas; # @array tiene ahora 8 elementos en total @array = ("naranja", "uva", "pera"); $m = shift(@array); # $m es "naranja", @array ("uva", "pera") $n = shift @array; # $n recoge "uva", @array es ("pera") shift @array; # @array se queda vacío $o = shift @array; # $o toma valor undef, @array sigue vacío unshift(@array, 5); # @array se llena con un elemento (5) unshift @array, 4; # @array es ahora (4, 5) @mas = (1, 2, 3); unshift @array, @mas; # @array es ahora (1, 2, 3, 4, 5)
Convirtiendo entre arrays y strings
Los arrays son listas de variables simples, por lo que un sólo array puede contener múltiples cadenas de texto. Pero, ¿cómo hacemos si queremos unir todas esas cadenas de texto en una sola? Una forma sencilla de hacerlo es utilizar la función join.
my @array = ("manzana", "bicicleta", "cuchara"); my $string = join( ", ", @array ); print $string; # imprime: "manzana, bicicleta, cuchara"
En este ejemplo, vemos el uso de join para unir los tres elementos del array en una sola cadena. El uso es simple, basta pasarle como parámetros el array del que tomar los valores, y el separador que queremos utilizar entre los elementos (en este caso coma y espacio). El resultado devuelto por la función es la cadena resultante.
Al igual que join nos permite unir varios strings en uno solo, la función split hace lo contrario, romper una cadena de texto en varias partes, entregando el resultado en un array. Ahora, como parámetros debemos pasar el separador existente en la cadena, y la propia cadena de texto, mientras que el resultado debemos recogerlo en un array. Vemos un ejemplo:
my $string = "4-8-15-16-23-42"; my @values = split( "-", $string ); print "$values[0] -> $values[5] n"; # imprime: "4 -> 42"
Imagen | xxx en Flickr