Perl 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
Tiene estructuras de control orientado al bloque, similar a los 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
Cuando 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
Los operadores lógicos son la CONDICIÓN en una estructura de control.
EXPRESION_1 and EXPRESION_2;
EXPRESION_1 or EXPRESION_2;
EXPRESION_1 && EXPRESION_2;
EXPRESION_1 || EXPRESION_2;
EXPRESION_1 eq EXPRESION_2;
EXPRESION_1 == EXPRESION_2;
Donde
EXPRESION_1
y EXPRESION_2
son variables a comparar o 'expresiones' boleanas(verdadero o falso) según el contexto en que se use.Operador triario
Una 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
Las 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
Perl 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
Perl 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
Los siguientes apartados son ejemplo de como usar las sentencias de control en Perl.
For
# Recorre 101 veces, valor determinado por $i. for($i=0;$i<100;$i++){ $j++; # Incrementa el valor de j. }
Foreach
@array = (23,35,'rosas','rojas',3,'5 numeros'); # Recorre todos los valores de la lista. foreach(@array){ print $_; # Imprime el valore almacenado. }
If
$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, # persigen 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');