Estructura Interna de perl

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');