O que precisa ficar claro, é que isso não é um bug!<div><br></div><div>Quando você escreve sem utilizar parenteses o perl vai interpretar seguindo alguns padrões, por exemplo:<br><br></div><div><meta http-equiv="content-type" content="text/html; charset=utf-8"><font class="Apple-style-span" face="'courier new', monospace">print "" or "lele";</font></div>

<meta http-equiv="content-type" content="text/html; charset=utf-8"><div><span class="Apple-style-span" style="font-family: 'courier new', monospace; "># executa o print vazio</span></div><div><font class="Apple-style-span" face="'courier new', monospace">e </font></div>

<div><meta http-equiv="content-type" content="text/html; charset=utf-8"><font class="Apple-style-span" face="'courier new', monospace">print "" || "lele";</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><meta http-equiv="content-type" content="text/html; charset=utf-8"># escreve "lele"</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace">Isso acontece porque usando || o perl viu que o valor de "" era falso e jogou "lele" como "coalesce",</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">porém, usando "or" o perl entendeu quer era pra fazer: escrever "" e OU retorne "lele"</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><br>

</font></div><div><font class="Apple-style-span" face="'courier new', monospace">ou seja:<br><meta http-equiv="content-type" content="text/html; charset=utf-8">print "" or "lele";</font></div>
<div>
<font class="Apple-style-span" face="'courier new', monospace">virou =></font></div><div><font class="Apple-style-span" face="'courier new', monospace"><meta http-equiv="content-type" content="text/html; charset=utf-8">print ("") or "lele";</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace">da mesma forma que </font></div><div><font class="Apple-style-span" face="'courier new', monospace"><meta http-equiv="content-type" content="text/html; charset=utf-8">do {</font><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">say "x"</span><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">} while 0</span></div>

<meta http-equiv="content-type" content="text/html; charset=utf-8"><div><font class="Apple-style-span" face="'courier new', monospace">vai ser diferente de</font></div><div><font class="Apple-style-span" face="'courier new', monospace">say "x" while 0</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">que se precisa ser isolado, deve ser isolado assim:</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><meta http-equiv="content-type" content="text/html; charset=utf-8">do { say "x" while 0 };</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace">Vale a mesma coisa para blocos implicitos (apenas { } ) e eval {}</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"> </font></div><div><br><div class="gmail_quote">2011/7/4 Renato Santos <span dir="ltr"><<a href="mailto:renato.cron@gmail.com">renato.cron@gmail.com</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">do {} vai criar um bloco<div><br></div><div>mais precisamente, fazer, depois testar o resultado.</div><div>do {} while no perl é feito para fazer igual <span style="font-family:'Courier New'">Repeat ~</span>  <span style="font-family:'Courier New'">Until</span> do delphi.</div>


<div><br></div><div>Como while não é uma condicional, o comando esta certo!</div><div><br></div><div>Eu chamo isso de "bate depois pergunta"</div><div>Pois se fosse </div><div>while ( 0 ) { do { ... } }  primeiro ia perguntar depois bater!</div>


<div><br></div><div><div><div></div><div class="h5"><br><div class="gmail_quote">2011/7/4 Lucas Buchala <span dir="ltr"><<a href="mailto:lucasbuchala@gmail.com" target="_blank">lucasbuchala@gmail.com</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Eu sempre achei que onde eu tivesse uma única instrução, eu poderia<br>
substituir a instrução por um bloco "do { ... }" e a lógica ficaria<br>
sempre a mesma.<br>
<br>
Mas agora vi esse exemplo do comportamento bizarro do do-while:<br>
<br>
-----------------------------------------------------<br>
$ perl -E 'say "hello" while 0'<br>
(Não imprime nada)<br>
<br>
$ perl -E 'do { say "hello" } while 0'<br>
hello<br>
-----------------------------------------------------<br>
<br>
Com uma única instrução, o while (falso) NÃO executa nenhuma vez, o<br>
que já era esperado.<br>
Mas com um bloco "do", o while (falso) executa uma vez.<br>
Qual o "rationale" aqui? Apenas para igualar o comportamento do<br>
do-while da linguagem C, de executar pelo menos uma vez? Na minha<br>
opinião, esse design ficou meio inconsistente... :-(<br>
=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
</blockquote></div><br><br clear="all"><br></div></div>-- <br>Renato Santos<br><a href="http://www.renatocron.com/blog/" target="_blank">http://www.renatocron.com/blog/</a><br>
</div>
</blockquote></div><br><br clear="all"><br>-- <br>Renato Santos<br><a href="http://www.renatocron.com/blog/" target="_blank">http://www.renatocron.com/blog/</a><br>
</div>