<br><div class="gmail_quote">2010/7/1 Andre Carneiro <span dir="ltr">&lt;<a href="mailto:andregarciacarneiro@gmail.com">andregarciacarneiro@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<br><br><div class="gmail_quote">2010/7/1 Solli Honorio <span dir="ltr">&lt;<a href="mailto:shonorio@gmail.com" target="_blank">shonorio@gmail.com</a>&gt;</span><div class="im"><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


<br><div class="gmail_quote">Em 1 de julho de 2010 10:09, Solli Honorio <span dir="ltr">&lt;<a href="mailto:shonorio@gmail.com" target="_blank">shonorio@gmail.com</a>&gt;</span> escreveu:<br><div> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">




<div class="gmail_quote"><div><div>2010/7/1 GmailPaqui <span dir="ltr">&lt;<a href="mailto:cpaqui@gmail.com" target="_blank">cpaqui@gmail.com</a>&gt;</span><br></div></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">








  

<div bgcolor="#ffffff" text="#000000">
Caros, bom dia!<div><div></div><div><div><div></div><div><br>
<br>
Se a passagem de parâmetros por referência é ruim, como proceder no
caso onde tenho dois parâmetros, um hash e um scalar, e o segundo
parâmetro é opcional?<br>
Devo testar se hash está completo, pares de valor?  <br>
<br>
<div>-- <br>
<span style="font-family: Verdana,sans-serif; font-size: 10pt; color: rgb(102, 153, 204);">
<b>Cleive Paqui</b> <br>
<br>
</span> </div>
</div></div></div></div></div>

<br></blockquote><div><br>Cleive, <br><br>Como disse o Gabriel, não é ruim, só estamos extrapolando uma questão técnica. A passagem por referência é uma opção válida e está dentro (e muito utilizada) do estilo de programação Perl. O único cuidado que é preciso ter quando você passa o valor por referência é ter a consciência de que as alterações dos valores nestas referencias dentro da função resultará na alteração do valor fora da função.<br>





<br>Dito isto, a tua pergunta permite a discussão da(s) boa(s) prática(s) para os parâmetros, e  eu achei que alguém iria abordar isto antes. Seguindo o PBP (Perl Best Practice - <a href="http://amzn.to/aDbCpR" target="_blank">http://amzn.to/aDbCpR</a> ) temos algumas recomendações sobre este assunto, sendo eles (não lembro de todos pois não estou com o PBP aqui agora) :<br>





<br>* return - não misture interface de erro com interface de dados. Se você utilizar o return para erro, só utilize para isto. Se utilizar para retornar o resultado da função, utilize apenas para isto. NUNCA faça as duas coisas ao mesmo tempo (ou pelo mesmo canal);<br>





<br>* parâmetros <br>1o. nunca manipule diretamente os valores através do $_[0], $_[1] ..., a menos que você realmente saiba o que está fazendo. E se você realmente souber, não fará isto numa programa sério. Além ter de alterar os valores originais, isto deixa o programa ilegível;<br>


</div></div></blockquote></div></blockquote><div><br></div></div><div>Traduzindo... assim que obter $_[0] , $_[1], ou mesmo $1, $2(oriundas de expressões regulares), trate de colocar numa variável declarada o mais rápido possível!</div>

<div class="im">
<div> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


<div class="gmail_quote"><div>


<br>2o. utilize a atribuição simples (sem passagem de referencia) apenas quando for utilizado até 2 parâmetros scalares ou apenas um parâmetro de grupo (hash ou array);<br></div></div></blockquote></div></blockquote><div>


<br></div></div><div>Eu já vi isso no PBP, mas acho discutível. No caso do meu trabalho, normalmente trabalho com alguns objetos relativamente grandes(estou falando de HTML::TreeBuilder::XPath). Nesse caso eu prefiro passar por referência para evitar a cópia desse objeto. Mas você tem razão ao dizer que tem que se tomar muito cuidado com o que se faz, depois que a função para qual se passou a referência termina, pois o objeto ainda estará ativo fora do escopo dessa função. Um exemplo que eu tenho sempre por aqui...</div>


<div><br></div><div>&lt;code&gt;</div><div><br></div><div>.</div><div>.</div><div>.</div><div>my $tree = HTML::TreeBuilder::XPath-&gt;new_from_content($string);</div><div>$self-&gt;treat_tree(\$tree);</div><div>$tree = $tree-&gt;delete; # Isso aqui destroi o objeto !!!</div>


<div><br></div><div>.</div><div>.</div><div>.</div><div><br></div><div>sub treat_three {</div><div>   my ($self, $tree) = @_;</div><div><br></div><div>   my pedaco_de_html = ${$tree}-&gt;findnodes(&quot;/html//body/... &quot;);</div>


<div><br></div><div>.</div><div>.</div><div>.</div><div>   </div><div>}</div><div><br></div><div>&lt;/code&gt;</div><div><br></div><div><br></div><div>Solli, você acha esse tipo de coisa válida ou eu realmente deveria passar $tree sem a referência? Eu pessoalmente prefiro passar por referência como disse, para evitar a cópia do objeto, e também, para evitar que eu tivesse que destruir o objeto HTML::TreeBuilder::XPath duas vezes no caso(uma na função e outra fora dela). Por favor me dê sua opinião sobre esse caso.</div>

<div class="im">
<div></div></div></div></blockquote><div><br>Eu recomendo passagem por referência mesmo, a minha preocupação aqui nem é desempenho e sim consumo de recurso. Sabemos que as linguagens dinâmicas não gostam de liberar memória após o uso, então quando estou lidando com objetos pesados eu gosto de utilizar referências para evitar problema com este recurso.<br>

 </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class="gmail_quote"><div class="im"><div> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="gmail_quote"><div><br>3o. é fortemente recomendado utilizar a técnica de &quot;named arguments&quot;. Isto significa passar os argumentos através de uma hash, onde a tua função poderá saber se todos os argumentos obrigatórios estão presente.<br>





<br>4o. considere retornar o resultado de uma função via um argumento de referencia.<br><br>Um exemplo, meu, para uma subrotina seria assim :<br><br>&lt;code&gt;<br><br>sub minha_rotina {<br>  my %args = @_;<br><br>  # verifica argumentos obrigatórios<br>





<br>  for my $arg ( qw (arg1 arg3 arg4 ) ) {<br>    die &quot;Argumento $arg é obrigatório mas não foi informado&quot; if ! exist $args{$arg};<br>  }<br><br>  ... faça alguma coisa com os argumentos ...<br><br>}<br><br>&lt;/code&gt;<br>





<br>Outras fontes sobre isto : <br><br><a href="http://www.perl.com/pub/a/2006/02/23/advanced_subroutines.html" target="_blank">http://www.perl.com/pub/a/2006/02/23/advanced_subroutines.html</a>   (mas por favor, nunca utilize prototypes)<br>





<a href="http://perldesignpatterns.com/?NamedArguments" target="_blank">http://perldesignpatterns.com/?NamedArguments</a><br><a href="http://www.devshed.com/c/a/Perl/Subroutines-in-Perl/3/" target="_blank">http://www.devshed.com/c/a/Perl/Subroutines-in-Perl/3/</a><br>





<a href="http://www.cs.cf.ac.uk/Dave/PERL/node126.html" target="_blank">http://www.cs.cf.ac.uk/Dave/PERL/node126.html</a><br><br></div><div><div><div> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">





_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div></div></div><br><br clear="all"><br><div>-- <br><div><div></div><div>&quot;o animal satisfeito dorme&quot;. - Guimarães Rosa<br>






</div></div></div></blockquote></div><div><div></div><div><br><br clear="all"><br>-- <br>&quot;o animal satisfeito dorme&quot;. - Guimarães Rosa<br>
</div></div><br>_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org" target="_blank">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div></div><br><br clear="all"><br>-- <br><div><div></div><div class="h5">André Garcia Carneiro<br>

Analista/Desenvolvedor Perl<br>
(11)82907780<br>
</div></div><br>_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br><br clear="all"><br>-- <br>&quot;o animal satisfeito dorme&quot;. - Guimarães Rosa<br>