[SP-pm] Comportamento do do-while

Renato Santos renato.cron at gmail.com
Mon Jul 4 07:43:19 PDT 2011


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/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20110704/39ca1315/attachment.html>


More information about the SaoPaulo-pm mailing list