Algunas Sentencias de Control

Los condicionales y los bucles son como en C. La mayor diferencia es que requieren que la sentencia bajo control sea siempre un bloque, esto es, este escrita entre llaves. Puede encontrar una breve introducción a las sentencias de control en perlintro.

if

        if ( condition ) {
            ...
        } elsif ( other condition ) {
            ...
        } else {
            ...
        }

La estructura de control unless

Si se quiere ejecutar un bloque de código cuando el condicional es falso se puede usar unless:
unless ($a < $b) {
  print "$a >= $b\n";
}
que es equivalente a:
if ($a < $b)  { }
else {
  print "$a >= $b\n";
}
Por supuesto, siempre cabe la posibilidad de negar la condición:
if (!($a < $b)) {
  print "$a >= $b\n";
}

Forma Sufija

Si no se quieren escribir las llaves se puede usar la notación sufija de la sentecia:

        # la forma tradicional
        if ($zippy) {
            print "Yow!";
        }

        # al estilo Perl
        print "Yow!" if $zippy;

Una expresión puede ir seguida de una sentencia de control que determina su evaluación. Por ejemplo:

print "$n < 0 \n" if $n < 0;

while

        while ( condition ) {
            ...
        }

También se puede usar en sufijo;

        print "LA LA LA\n" while 1;          # loops forever

for y foreach

Se puede usar como en C:

        for ($i = 0; $i <= $max; $i++) {
            ...
        }

O en estilo Perl:

lhp@europa:~/projects/perl/src/perltesting$ cat ./for.pl
#!/usr/bin/perl -w
use warnings;
use strict;

foreach my $i (1..5) {
  print "$i ";
}

print "\n";

print "$_ " foreach (1..5);

print "\n";

for my $i (1..5) {
  print "$i ";
}

print "\n";
Al ejecutarlo produce:
lhp@europa:~/projects/perl/src/perltesting$ ./for.pl
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

La estructura de control until

Existe asimismo un bucle until:
until ($j > $i) { $j *= 2; }
que se ejecutará hasta que la condición pasa a ser cierta.

next

El comando next comienza la siguiente iteración del bucle:

    LINE: while (<STDIN>) {
        next LINE if /^#/;      # discard comments
        ...
    }

last

El comando last produce la salida del bucle:

    LINE: while (<STDIN>) {
        last LINE if /^$/;      # exit when done with header
        ...
    }

Switch

Use el módulo Switch (no es necesario en las versiones posteriores a la 5.10):

lhp@europa:~/projects/perl/src/perltesting$ cat switch.pl
#!/usr/bin/perl -w
use strict;
use Perl6::Say;
use Switch;

my $val = <>;
chomp($val);

switch ($val) {
  case 1          { say "number 1" }
  case "a"        { say "string a" }
  case [1..10,42] { say "number in list" }
  case /^\w+$/    { say "pattern" }
  else            { say "previous case not true" }
}
Veamos algunas ejecuciones:
lhp@europa:~/projects/perl/src/perltesting$ ./switch.pl
5
number in list
lhp@europa:~/projects/perl/src/perltesting$ ./switch.pl
12bc
pattern
lhp@europa:~/projects/perl/src/perltesting$ ./switch.pl
.2.
previous case not true



Subsecciones
Casiano Rodríguez León
2009-10-04