next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Iterpolación de arrays en Sup: Introducción Ant: Práctica: Radio de una Err: Si hallas una errata ...

Arrays y Listas

Una variable array puede almacenar una secuencia de valores escalares, los cuales se identifican unívocamente a través de un índice. Los contenidos de un array pueden ser colectivamente accedidos usando el nombre del array precedido del símbolo @.

@days  = (1,2,3,4,5,6,7);
@days[3,4,5]        # same as @days[3..5]

El operador .. toma dos numeros $ x_1$ y $ x_2$ y devuelve una lista con los enteros entre esos dos números:

  DB<1> @b = 4..8
  DB<2> p @b
45678
  DB<3> x @b
0  4
1  5
2  6
3  7
4  8
  DB<4> @a = 2.1 .. 4.1
  DB<5> x @a
0  2
1  3
2  4

Este operador devuelve una lista vacía cuando $ x_2 < x_1$.

  DB<6> @c = 5..4
  DB<7> p @c

  DB<8> x @c
  empty array

Los valores individuales de un array se acceden precediendo de un $ el nombre del array:

foreach $i (0..5) {
  print $days[$i]," es un día laboral/n";
}

El índice del primer elemento es cero.

Si se omite la variable que se usa para indexar en el bucle, se usará la variable mágica por defecto $_. Así el bucle anterior es equivalente a:

foreach  (0..5) {
  print $days[$_]," es un día laboral/n";
}

Una asignación a un elemento que no existe lo crea:

$days[9] = 10;

Los elementos extra $days[6], $days[7] and $days[8] son asi mismo creados y se inicializan al valor indefinido undef.

La variable $#days almacena el índice del último elemento del array. En Perl, los índices negativos cuentan desde el final del array (-1 es el último elemento).

DB<1> @a = 1..10
DB<2> $a[-1] = 1
DB<3> p "@a"
1 2 3 4 5 6 7 8 9 1
DB<4> $a[-20] = 0
Modification of non-creatable array value attempted, 
subscript -20 at (eval 18)
[/usr/share/perl/5.6.1/perl5db.pl:1521] line 2.

Si el array completo es accedido en un contexto en el que se espera un escalar numérico, (scalar context) el resultado es un escalar conteniendo el número de elementos del array.

$i = 0;
while ($i < @days) {
  print $days[$i++],"\n";
}

Los arrays estan muy relacionados, pero no son lo mismo que las listas. Una lista en Perl es una secuencia de valores separados por comas, normalmente entre parentesis. Un array es un contenedor para una lista. Las listas pueden usarse para extraer valores de los arrays. Por ejemplo:

($d1, $d2) = @days;

Si hay mas variables en la lista que elementos en el array, las variables extra quedan indefinidas (undef). Si por el contrario hay menos variables que elementos en el array, los elementos extra son ignorados.

Se puede asignar listas de valores a listas de variables:

($a, $b) = ($b, $a);
que intercambia los valores de $a y $b.

Una abreviación muy cómoda para crear listas de cadenas la proporciona el operador qw. Una cadena formada por palabras separadas por espacios en blanco dentro de qw se descompone en la lista de sus palabras.

@a = qw(uno dos tres); # @a == ("uno","dos", "tres")
Observa que no se ponen comas entre las palabras. Si por error escribieras:
@a = qw(uno, dos, tres); # @a == ("uno,","dos,", "tres")
obtendrías comas extra en los elementos de la lista.

Otro ejemplo:

@week = qw(monday tuesday wednesday thursday friday saturday sunday);

Los escalares no inicializados tienen el valor undef. Sin embargo, las variables array no inicializadas tienen como valor la lista vacía (). Si se asigna undef a una variable de tipo array lo que se obtiene es una lista cuyo único elemento es undef:

@a = undef; # Equivalente a @a = ( undef );
if (@a) { ... } # Por tanto TRUE
El modo mas simple de evitar este tipo de problemas cuando se quiere limpiar una variable de tipo array es asignar explícitamente la lista vacía ():
@a = ();
if (@a) { ...}; # scalar(@a) == FALSE
También se puede usar el operador undef:
undef @a;
if (defined(@a)) { ... }; # FALSE

Es posible asignar undef a los elementos de un array:

$a[3] = undef;
O bien usando la lista vacía, como se hace en la siguiente sesión con el depurador:
  DB<1>  @a = 0..9
  DB<2> @a[1,5,7] = ()
  DB<3> p "@a"
0  2 3 4  6  8 9
  DB<4> p $#a
9
  DB<5> p scalar(@a)
10
  DB<6> $" = ","
  DB<7> p "@a"
0,,2,3,4,,6,,8,9
  DB<8> @a[1..7] = ()
  DB<9> p "@a"
0,,,,,,,,8,9



Subsecciones
next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Iterpolación de arrays en Sup: Introducción Ant: Práctica: Radio de una Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21