[Perl] Estructuras de control

Perl tiene varias clases de estructuras de control para poder tomar decisiones crear bucles dentro del código. En cuanto a la sintaxis, las condiciones están rodeadas por paréntesis y los bloques por llaves.

if y unless

Los bloques de control if sirven para tomar decisiones. Se utiliza if para establecer la condición que se debe cumplir y el bloque de código a ejecutar si se cumple. Si no se cumple se ejecuta el bloque que va precedido por else. La directiva elsif es una contracción de ambas (si no se cumple la condición anterior pero se cumple ésta).

if ( condition1 ) {
    ...    # bloque de instrucciones
} elsif ( condition2 ) {
    ...    # bloque de instrucciones
} else {
    ...    # bloque de instrucciones
}

Una forma de poner condiciones negativas que puede ayudar a leer el código con mayor claridad es usar unless en lugar de if:

unless ( condition ) { 
    # igual a: if ( !condition )
    ...    # bloque de instrucciones
}

En algunos lenguajes, las llaves se puede eliminar si los bloques de código tienen sólo una línea. En Perl no se puede, pero sí pueden escribirse al revés, para tener una apariencia más cercana al lenguaje humano:

if ($condition) {    # estilo tradicional
    print "Yow!";
}

# bloque de una línea al estilo Perl
print "Yow!" if $condition;
print "No hay leche" unless $leche;

while, do while y until

La sentencia while permite realizar un bucle en el código, ejecutar una bloque de instrucciones mientras se cumpla una condición.

while ( condition ) {
    ...
}

Para mejorar la lectura de algunas condiciones, existe el comando until, equivalente a una negación de while (ejecuta el bloque de instrucciones mientras no se cumpla la condición):

until ( condition ) {
    # equivale a: while ( !condition )
    ...
}

En ambos casos, primero se comprueba la condición, y si se cumple, se ejecuta el bloque de código en cuestión. Si queremos invertir el proceso, podemos usar do while y do until para ejecutar el bloque y después comprobar la condición para ver si se sale o no del bucle:

do {
    ...
} while ( condition );


do {
    ...
} until ( condition );

Como con los if/unless, while/until también pueden escribirse al revés si se trata de una sola instrucción en el bloque:

print "LA LA LAn" while 1;   # bucle infinito

for

El bucle for, enfocado a recorrer listas, pues incluye en su sintaxis la inicialización de un índice, la condición a cumplir, y la actualización del índice.

for ( initialization ; condition ; increment ) {
    ...
}

Hay otra forma más compacta para escribir los bucles for cuando conocemos los números de inicio y fin del bucle (al estilo de foreach). Los siguientes ejemplos son equivalentes:

for ($i = 1; $i <= 10; $i++) {    # forma típica
    ...
}

for (1..10) {    # forma compacta
    ...
}

foreach

El bucle foreach está basado en el bucle for, pero es todavía más cómodo para leer el contenido de los arrays y hashes, ya que lleva implícitas las tres expresiones del bucle for (inicialización, condición e incremento).

foreach $variable (@array) {
    ...
}

Si no se especifica una variable, el valor correspondiente a esa ejecución del bucle se almacena en la variable por defecto de Perl, $_. Las siguientes sentencias son pues, equivalentes:

foreach $var (@array) {
    print "Este elemento es $varn";
}

foreach (@array) {
    print "Este elemento es $_n";
}

Se puede escribir de forma compacta la condición (como for), e invertir el orden como if o while:

print $list[$_] foreach 0 .. $max;

Aunque foreach recorre un array, también es útil para leer un hash. Nos podemos servir del comando keys para obtener un array con todas las claves de un hash y pasárselo a foreach para poder recorrer el hash leyendo todos sus valores:

my $key;
my @keylist = keys %hash;
foreach $key (@keylist) {
    print "El valor de la clave $key es $hash{$key}n";
}

# Mismo código de forma más compacta
foreach my $key (keys %hash) {
    print "El valor de la clave $key es $hash{$key}n";
}

Imagen | Barney Moss en Flickr

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s