Laços WHILE e DO WHILE em Perl - Como usar

Neste tutorial de Perl, vamos dar início ao estudos das estruturas de repetição, também chamadas de laços ou loopings, começando pelo bom e velho while e depois vamos conhecer o do while.

Laço WHILE em Perl

A sintaxe do laço WHILE é a seguinte:
while( expressão ){
   # código a ser executado
   # caso a expressão seja
   # verdadeira
}
Funciona da seguinte maneira: digitamos while, abrimos parêntesis e dentro deste colocamos alguma expressão. Pode ser um valor (como um número, um booleano como verdadeiro ou falso) ou geralmente uma condição, um teste condicional cujo resultado vai ser verdadeiro ou falso.

Caso a expressão final seja verdadeiro, o código dentro das chaves do laço WHILE é executado.
Ao final de cada execução (chamamos cada rodada de execução de iteração), a expressão é avaliada novamente.

Se ela continuar sendo verdadeira, o código continua a ser rodado e rodado e rodado...
O comum é haver alguma coisa dentro do código que uma hora vá mudar o teste condicional que está sendo realizado, para ele virar falso em algum momento e parar a execução do while.

Exemplos de laços WHILE em Perl

Primeiro, vamos aprender a contar de 1 até 100 com o laço WHILE.
Vamos usar a variável $num para armazenar números de 1 até 100, e printar eles na tela.

O código fica assim:
#!/usr/bin/perl

$num=1;

while($num <= 100){
        print $num, "\n";
        $num++;
}    

Primeiro, inicializamos a variável com o valor 1.
O teste que iremos fazer é: $num<=100
Em outras palavras: a variável é menor ou igual a 100? Se sim, rode o código abaixo...

No código dentro da estrutura de repetição, printamos a variável.
Em seguida, temos que incrementar ela em uma unidade, fazemos isso com o operador: ++

Agora, o valor de $num é 2. A expressão do while é avaliada novamente, e ela vai dar verdadeiro de novo. O código vai executar, printar, e incrementar...e isso vai acontecendo até $num ter o valor 100.

Nesse valor, o teste ainda é verdadeiro, o print é realizado e quando a variável é incrementada, passa a valer 101. Então, no próximo teste da expressão da while, o resultado vai ser falso e o looping é encerrado.

Vamos fazer agora o contrário, uma contagem regressiva, exibir de 1000 até 1:
#!/usr/bin/perl

$num=1000;

while($num>0){
        print $num, "\n";
        $num--;
}    

Note que inicializamos agora com o valor 1000, o teste é "enquanto ela for maior que 0" e decrementamos a variável ($num--).

Rapidinho fez essa conta, não foi? Poderoso, esse Perl, não é?

O looping DO WHILE em Perl

O laço WHILE tem uma característica especial: ele só roda a primeira iteração se a expressão contida nele for VERDADEIRA, se for FALSA, o laço nem começa.

Se você quiser que pelo menos uma iteração ocorra, que o teste seja executado pelo menos uma vez, recomendamos usar o DO WHILE. A estrutura dele é bem parecida com o while:
do{
   # código a ser
   # executado
}while(condição);   

Primeiro ele faz a iteração (DO), só depois é que testa a condição.
Se ela for verdadeira, executa de novo o código entre as chaves.

Uma grande utilidade do laço DO WHILE é exibir menus.
Os menus devem ser exibidos ao menos uma vez pro usuário, se ele quiser sair do programa logo de cara, ok, mas ele deve ser exibido pelo menos uma vez.

Vamos ver um exemplo de uma aplicação bancária:
#!/usr/bin/perl

do{
        print "Escolha uma opação:\n";
        print "0. Sair\n";
        print "1. Extrato\n";
        print "2. Saque\n";
        print "3. Transferência\n\n";
        chomp($op = <STDIN>);
}while($op != 0);
Armazenamos a opção do usuário na variável $op.
Se ele digitar 1, 2 ou 3, deve ocorrer alguma coisa específica (chamar as opções de transferência, ir pra tela de saque etc), depois veremos como incrementar isso em Perl.

Depois, o menu é exibido novamente.
E ele só para de ser exibido se você digitar 0, para sair.
Veja o teste: $op != 0
Isso quer dizer: rodar esse looping, enquanto a opção for diferente de 0.

O código a seguir pede a senha para o usuário.
Se for correta, cai no IF e avisamos que está entrando no sistema.
Se for errada, cai no ELSE e avisamos para ele tentar novamente:
#!/usr/bin/perl

do{
        print "Digite a senha:\n";
        chomp($password = <STDIN>);

        if($password eq 'rush2112'){
                print "Entrando no sistema...\n";
        }else{
                print "Senha errada, tente novamente.\n\n";
        }
}while($password ne 'rush2112');
Note que a condição é: enquanto a senha não for igual a "rush2112".
Ou seja, a senha é rush2112, se ele não digitar a senha correta, vai ficar preso eternamente nessa tela pedindo senha...a única maneira de entrar no sistema portanto, é digitando a senha correta.

Veja que colocamos um teste condicional IF ELSE dentro de uma estrutura de controle DO WHILE, isso é bastante comum na programação, os testes, laços e loopings serem 'aninhados' a outras estruturas de controle de fluxo.

Vamos ver agora como imprimir de 1 até 100 com o DO WHILE:
#!/usr/bin/perl

$num=1;

do{
        print $num, "\n";
        
}while(++$num<=100);
Note o comando: ++$num <=100
Isso quer dizer que primeiro a variável $num é incrementada (pois o símbolo ++ veio antes) e só depois que ela é usada para o teste condicional.

Agora faça: $num++ <= 100
O que acontece com o resultado? Por quê?
Explique nos comentários.

Nenhum comentário:

Veja também: