Laços (Loops)

Laços, ou 'loops', são blocos que executam várias vezes. Costumam ser usados em ações repetitivas, manipulando estruturas de dados inteiras, etc.

For/Foreach

O laço Foreach ("para cada") costuma ser usado para varrer listas ou arrays. Por exemplo:

foreach my $elemento (1, 2, 3, 4, 5) {
    say $elemento;
}

Naturalmente, você também pode passar um array:

my @array = (1 .. 5);
foreach my $elemento (@array) {
    say $elemento;
}

Como você pode ver, criamos uma variável especial $elemento que se transforma em cada um dos elementos do array, em cada iteração. Cuidado, pois ao mudar o valor de $elemento você muda o valor original no array:

my @array = (1 .. 5);
foreach my $elemento (@array) {
    $elemento *= 2;
}

foreach my $elemento (@array) {
    say $elemento;
}

Exercício

Imprima apenas os valores pares entre 0 e 10:

foreach my $element (...) {
    if (...) {
        ...
    }
}

While

O While ("enquanto") é um laço mais avançado que executa enquanto a expressão avaliada for verdadeira.

my $i = 10;
while ($i > 0) {
    say $i;

    $i = $i - 1;
}

Assim que a expressão $i > 0 se tornar falsa, o laço para de rodar.

Exercício

Exiba apenas os valores ímpares entre 0 e 10:

my $i = ;
while ($i ...) {
    if (...) {
        ...
    }
}

Saíndo do loop

Em muitos casos você quer terminar o loop sem ter que esperar até ele acabar de rodar. Você pode fazer isso usando a palavra-chave last:

my $i = 0;
while ($i < 100) {
    last if $i == 10;

    say $i;

    $i = $i + 1;
}

Esse laço não vai iterar 100 vezes porque nós interrompemos ele quando o $i vale 10.