Neste capitulo do tutorial Perl nós iremos ver como os laços do tipo while funcionam em Perl.

use strict;
use warnings;
use 5.010;

my $contador = 10;

while ($contador > 0) {
  say $contador;
  $contador -= 2;
}
say 'pronto';

O laço while possui uma condição, exemplificada no caso acima avaliando se a variável $contador é maior do que 0, seguido de um bloco de código envolto por chaves.

Quando a execução do código acima atinge o ponto inicial do laço while, ocorre então a verificação da condição onde a mesma é testada retornando um valor verdadeiro ou falso. Caso seja FALSA o bloco é ignorado e a próxima declaração do código é realizada, imprimindo 'pronto' na tela.

Se a condição do laço while for VERDADEIRA então o bloco é executado. Após isso a execução retorna ao ponto de teste e a condição é testada novamente. Caso dessa vez seja falsa, o bloco é ignorado e o texto 'pronto' é impresso na tela. Se for verdadeira o bloco é executado novamente, e em seguida retornando ao ponto de teste...

Esse processo se repete enquanto a condicional testada retornar valor verdadeiro, ou seja:

while (condição-for-verdadeira) { faça algo }

Laços infinitos

No código exemplo acima nós sempre reduzimos o valor da variável, dessa forma garantimos que em algum momento a condicional seria falsa. Se por algum motivo a condicional nunca se tornar falsa você terá um laço infinito. O seu programa ficará preso em um pequeno bloco de execução e nunca conseguirá escapá-lo.

Isso aconteceria se nós por exempĺo, estivéssemos esquecido de reduzir o valor da variável $contador, ou se nós estivéssemos aumentando o seu valor.

Se nesse caso fosse um acidente, então nós teríamos um bug.

Por outro lado, em alguns casos o uso proposital de laços infinitos pode deixar o seu programa mais simples de escrever e fácil de ser lido. E nós adoramos código fácil de ser lido! Se nós fossemos utilizar um laço infinito, poderíamos utilizar uma condição que sempre seja verdadeira.

Então podemos escrever:

while (42) {
  # faça algo aqui
}

É claro que pessoas que não possuam as referências culturais adequadas irão se perguntar o porque de usar 42, então podemos utilizar o sempre entediante número 1 em laços infinitos.

while (1) {
  # faça algo aqui
}

Naturalmente, observando que a execução do código não possui escapatória do laço, você se perguntaria como pode então o programa encerrar a sua execução, talvez sendo interrompido externamente?

Para isso, existem diferentes resoluções:

Uma das soluções é utilizar a declaração last dentro do laço. Dessa forma, a execução irá ignorar o resto do bloco e não irá realizar mais as avaliações da condicional. Efetivamente terminando a execução do laço. As pessoas normalmente utilizam essa declaração dentro de alguma condicional.

use strict; use warnings; use 5.010;

while (1) { print "Qual linguagem de programação você está aprendendo agora? "; my $nome = ; chomp $nome; if ($nome eq 'Perl') { last; } say 'Errado! Tente novamente!'; } say 'pronto';

while (1) {
  # faça algo aqui
}

Neste exemplo nós fazemos uma pergunta ao usuário e esperamos que seja capaz de responder com a resposta correta. Caso não responda 'Perl', ficará preso no laço eternamente.

Então a conversa poderá seguir da seguinte forma:

Qual linguagem de programação você está aprendendo agora?
>  Java
Errado! Tente novamente!
Qual linguagem de programação você está aprendendo agora?
>  PHP
Errado! Tente novamente!
Qual linguagem de programação você está aprendendo agora?
>  Perl
pronto

Como pode observar, uma vez o usuário digitando a resposta correta, a declaração last é invocada e o resto do bloco iincluindo say 'Errado! Tente novamente!'; é ignorado e a execução segue adiante após o laço while.