Programación en Perl/Estructuras de control
Estructuras de control
editarPerl tiene varias clases de estructuras de control.
- Control de ciclos: do, while, for, foreach, continue.
- Control de sentencias: if, else, unless, until, elsif.
- Control de flujo: goto, elsif, next, last, redo, return.
Para varias sentencias
editarTiene estructuras de control orientado al bloque, similar a las de los lenguajes de programación C y Java.
- Las CONDICIONES están rodeadas por paréntesis () y
- Los BLOQUES rodeados por llaves {}
- Las expresiones opcionales por corchetes cuadrados []
- Las ETIQUETAS deben llevar al final dos puntos ':';
[ETIQUETA] while CONDICION BLOQUE [continue BLOQUE ]
[ETIQUETA] until CONDICION BLOQUE [continue BLOQUE ]
[ETIQUETA] foreach [VARIABLE] (LISTA) BLOQUE [continue BLOQUE]
[ETIQUETA] for (EXPRESION_1;EXPRESION_2;EXPRESION_3) BLOQUE
if CONDICION BLOQUE [[elsif BLOQUE] else BLOQUE]
unless CONDICION BLOQUE [else BLOQUE]
Donde
EXPRESION_1
es la expresion inicial, EXPRESION_2
la condicion y la EXPRESION_3
es la expresion incremental.
Para una sola sentencia
editarCuando se controla a una sola declaración, los modificadores de declaración proporcionan una sintaxis más ligera:
DECLARACIÓN if CONDICIÓN
DECLARACIÓN unless CONDICIÓN
DECLARACIÓN while CONDICIÓN
DECLARACIÓN until CONDICIÓN
DECLARACIÓN foreach LISTA
Donde
DECLARACIÓN
es una instrucción, llamada a alguna funcion, etc. y en estos casos la CONDICIÓN
en vez de estar rodeado por parentesis requiere un punto y coma al final de la condición.
Operadores lógicos
editarLos operadores lógicos se utilizan para construir la CONDICIÓN en una estructura de control.
EXPRESION1 and EXPRESION2;
EXPRESION1 or EXPRESION2;
EXPRESION1 && EXPRESION2;
EXPRESION1 || EXPRESION2;
EXPRESION1 eq EXPRESION2;
EXPRESION1 == EXPRESION2;
Donde
EXPRESION1
y EXPRESION2
son variables a comparar o 'expresiones' boleanas(verdadero o falso) según el contexto en que se use.
Operador triario
editarUna expresion que resume la sentencia if CONDICION BLOQUE else BLOQUE
es:
[DECLARACION] [(] CONDICIÓN ? EXPRESION_1 : EXPRESION_2 [)];
Donde la
EXPRESION_1
es el valor devuelto si la CONDICIÓN
es verdadera.
Control de flujo
editarLas palabras clave de control de flujo next
, last
, return
y redo
son expresiones, por lo que pueden ser usadas con los operadores cortocircuito.
Construcciones para ciclos
editarPerl también tiene dos construcciones implícitas para bucles:
resultados = grep { ... } lista
resultados = map { ... } lista
grep
devuelve todos los elementos de lista en que el bloque subordinado evalúa a verdadero. map
evalúa el bloque subordinado por cada elemento de lista y devuelve una lista de los valores resultantes. Estas construcciones permiten un estilo simple de programación funcional.
No hay declaración switch (salto multi-camino) en Perl 5. La documentación Perl describe media docena de formas de conseguir el mismo efecto usando otras estructuras de control. Existe sin embargo un módulo Switch, que proporciona la funcionalidad modelada para el próximo Perl 6.
Excentricidades para el control de flujo
editarPerl incluye una declaración goto etiqueta
, pero es usada raramente. Las situaciones donde en otros lenguajes se utiliza goto
no ocurren tan a menudo en Perl debido a sus amplias opciones de control de flujo.
Existe también una declaración goto &sub
que realiza una llamada 'final'. Termina la subrutina actual e inmediatamente llama a la sub
especificada. Esto se usa en situaciones donde una nueva subrutina puede realizar una gestión de la pila más eficiente que el propio Perl (porque típicamente no se requiere ningún cambio en la pila actual), y en una recursión muy profunda este tipo de llamadas puede tener un sustancial impacto positivo en el funcionamiento porque evita la sobrecarga de la gestión contexto/pila en el momento de retornar.
Ejemplos
editarLos siguientes apartados son ejemplo de como usar las sentencias de control en Perl.
For
editar# Imprime los valores que toma $i, desde 0 hasta 99
for($i = 0; $i < 100; $i++){
print "$i\n";
}
# Cuando $i es igual a 100 la expresion '$i < 100' se
# evalua como falsa y el bucle termina
# Imprime una lista de nombres
@amigos = ('Julia', 'Luis', 'Mateo', 'Maria');
$na = @amigos;
for($i = 0; $i < $na; $i++)
{
print "$amigos[$i]\n";
}
Foreach
editar# El ejemplo anterior escrito de forma más consisa
@amigos = ('Julia', 'Luis', 'Mateo', 'Maria');
print "$_\n" foreach(@amigos);
@array = (23,35,'rosas','rojas',3,'5 numeros');
# Recorre todos los valores de la lista.
foreach(@array){
print $_; # Imprime el valore almacenado.
}
If
editar$numero = 5;
# Evalua $numero.
if($numero == 5){
print 'Hola mundo';
}
$numero = 'hola';
print 'Hola mundo' if $numero eq 'hola';
print 'cruel' if $numero;
# Analiza las siguientes sentencias,
# persiguen el mismo resultado.
$numero = 0;
print 'nunca deberia imprimir este texto' if $numero;
print 'esta si se imprimira' if ! $numero;
if($numero){
print 'nunca deberia imprimir este texto';
}elsif($numero == 5){
print 'este texto tampoco se imprimira';
}else{
print 'esta si se imprimira';
}
print ($numero?'nunca deberia imprimir este texto':'esta si se imprimira');