[SP-pm] Comportamento do do-while

Tiago Peczenyj tiago.peczenyj at gmail.com
Mon Jul 4 07:55:05 PDT 2011


isso é algo desejado, imagine que vc quer um laço que execute pelo
menos uma vez:

my $continua = 0;

do {
  # codigo
  $continua = prompt("deseja continuar? ");

} while ( $continua );

claro que vc tem outras formas de fazer isso, mas se vc quer que o
while 0 nunca execute basta colocar na frente.

2011/7/4 Renato Santos <renato.cron at gmail.com>:
> O que precisa ficar claro, é que isso não é um bug!
> Quando você escreve sem utilizar parenteses o perl
> vai interpretar seguindo alguns padrões, por exemplo:
>
> print "" or "lele";
> # executa o print vazio
> e
> print "" || "lele";
> # escreve "lele"
> Isso acontece porque usando || o perl viu que o valor de "" era falso e
> jogou "lele" como "coalesce",
> porém, usando "or" o perl entendeu quer era pra fazer: escrever "" e OU
> retorne "lele"
> ou seja:
> print "" or "lele";
> virou =>
> print ("") or "lele";
> da mesma forma que
> do {say "x"} while 0
> vai ser diferente de
> say "x" while 0
> que se precisa ser isolado, deve ser isolado assim:
> do { say "x" while 0 };
> Vale a mesma coisa para blocos implicitos (apenas { } ) e eval {}
>
> 2011/7/4 Renato Santos <renato.cron at gmail.com>
>>
>> do {} vai criar um bloco
>> mais precisamente, fazer, depois testar o resultado.
>> do {} while no perl é feito para fazer igual Repeat ~  Until do delphi.
>> Como while não é uma condicional, o comando esta certo!
>> Eu chamo isso de "bate depois pergunta"
>> Pois se fosse
>> while ( 0 ) { do { ... } }  primeiro ia perguntar depois bater!
>>
>> 2011/7/4 Lucas Buchala <lucasbuchala at gmail.com>
>>>
>>> Eu sempre achei que onde eu tivesse uma única instrução, eu poderia
>>> substituir a instrução por um bloco "do { ... }" e a lógica ficaria
>>> sempre a mesma.
>>>
>>> Mas agora vi esse exemplo do comportamento bizarro do do-while:
>>>
>>> -----------------------------------------------------
>>> $ perl -E 'say "hello" while 0'
>>> (Não imprime nada)
>>>
>>> $ perl -E 'do { say "hello" } while 0'
>>> hello
>>> -----------------------------------------------------
>>>
>>> Com uma única instrução, o while (falso) NÃO executa nenhuma vez, o
>>> que já era esperado.
>>> Mas com um bloco "do", o while (falso) executa uma vez.
>>> Qual o "rationale" aqui? Apenas para igualar o comportamento do
>>> do-while da linguagem C, de executar pelo menos uma vez? Na minha
>>> opinião, esse design ficou meio inconsistente... :-(
>>> =begin disclaimer
>>>   Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>> =end disclaimer
>>
>>
>>
>> --
>> Renato Santos
>> http://www.renatocron.com/blog/
>
>
>
> --
> Renato Santos
> http://www.renatocron.com/blog/
>
> =begin disclaimer
>   Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>



-- 
Tiago B. Peczenyj
Linux User #405772

http://pacman.blog.br


More information about the SaoPaulo-pm mailing list