O laço while

while while (1) loop laço infinite loop laço infinito last

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


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`.

Otras páginas

Perl tutorial
O Laço For
O Jogo de Adivinhar Números
Documentação do núcleo da linguagem e de módulos do CPAN

Author

Gabor Szabo (szabgab) Gabor Szabo