Los bucles hacen lo mismo: recorren una serie de valores mientras se cumpla una condición.
Hay dos tipos de bucles for:
for (my $i = 0; $i < 100; $i++) {Este es igual que en el lenguaje C: tiene tres partes: inicialización, condición e incremento. Y se ejecutan de la misma manera que en el lenguaje C
for my $i (0..99) {Esta es una solución general de bucles: recorre los valores indicados y los va guardando en la variable del bucle. Lo mismo sirve para recorrer los índices de un
array:
for my $i (0 .. $#array) {que para recorrer los valores de un
array:
for my $valor (@array) {Los bucles while() (al igual que los until()) son más sencillos: son bucles que se ejecutan mientras la condición sea verdadera (o falsa en el caso del until()). De esta forma, el bucle for heredado del C se puede escribir así:
Using perl Syntax Highlighting
my $i = 0;
while ( $i < 100 ) {
...;
}
continue {
$i++;
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
La parte de continue{} se ejecuta cuando se ha terminado de ejecutarse cada vuelta del bucle.
Pero... hay una gran diferencia entre while y for... bueno... dos
- los valores que se usan en el bucle for son alias de los valores definidos al principio. Eso quiere decir que podemos modificarlos dentro de un bucle for, y así estaremos modificando los valores de origen. Ejemplo: supongamos que tenemos un array con valores enteros, y que queremos modificar todos los valores, multiplicándoles por 8. Lo normal sería hacerlo así:
Using perl Syntax Highlighting
for my $i (0 .. $#array) { # recorremos los índices
$array[$i] *= 8; # modificamos los valores del @array
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Con Perl, se puede hacer simplemente así:
Using perl Syntax Highlighting
for my $valor (@array) { # recorremos los valores
$valor *= 8; # modificamos los valores del @array
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Esto puede despistar al novato, pero si lo leemos de corrido, lo vemos más lógico.
. - en un bucle for(), Perl se hace con todos los valores posibles antes de empezar a dar vueltas, mientras que con while(), la condición se va ejecutando paso a paso. Esto se ve claramente con la forma de trabajar con los archivos. Si lo hacemos con while():
Using perl Syntax Highlighting
open my $fh, '<', 'archivo.txt';
while (<$fh>) {
# aquí procesamos la línea
}
close $fh;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
en cada vuelta, el while lee una línea del archivo, hasta el final del archivo. En cambio, con for():
Using perl Syntax Highlighting
open my $fh, '<', 'archivo.txt';
for (<$fh>) {
# aquí procesamos la línea
}
close $fh;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
también vamos procesando línea a línea, pero... ¡el for se ha descargado a memoria todas las líneas del archivo, de golpe! Si el archivo es muy grande, pues podremos tener problemas de memoria agotada.
¡Ah!, y el foreach... es igual que el for, pero con cuatro letras más (sí, así es: 'each'
).
Más información en tu propio ordenador en
perldoc perlsyn,
y en la Web (
traducido al español).