Andre,<div><br></div><div>Vou pegar como exemplo o segundo método da documentação do MooseX::Params::Validate:</div><div><br></div><div><div>sub bar {</div><div>    my $self = shift;</div><div>    my ( $foo, $baz, $gorch ) = validated_list(</div>
<div>        \@_,</div><div>        foo   => { isa => 'Foo' },</div><div>        baz   => { isa => 'ArrayRef | HashRef', optional => 1 },</div><div>        gorch => { isa => 'ArrayRef[Int]', optional => 1 }</div>
<div>    );</div><div>    [ $foo, $baz, $gorch ];</div><div>}</div></div><div><br></div><div>Então, primeiro o $self é consumido da lista de argumentos (ele sempre vem como primeiro argumento de toda chamada a um método em uma instância), e logo em seguida os demais argumentos são fornecidos pelo retorno do validated_list(). Mas o validated_list precisa saber de onde extrair os demais valores, e faz isso recebendo uma referência ao demais parâmetros recebidos pelo método. Se fosse uma assinatura normal, você teria:</div>
<div><br></div><div>my ($self, $foo, $baz, $gorch) = @_;</div><div><br></div><div>Deve rolar algum truque com os símbolos para associar 'foo', 'baz' e 'gorch' no hash recebido por validated_list() com $foo, $baz e $gorch, mas acredito que o motivo pelo qual temos de passar a lista de argumentos, seja como cópia dos valores ou como referência, é evidente -- validate_list() precisa saber quais foram os argumentos recebidos e compará-los com os tipos informados.</div>
<div><br></div><div>Se eu entendi direito a sua pergunta, acho que a minha resposta deve ter sido menos pior agora. =)</div><div class="gmail_extra"><br><br><div class="gmail_quote">2012/12/4 Andre Carneiro <span dir="ltr"><<a href="mailto:andregarciacarneiro@gmail.com" target="_blank">andregarciacarneiro@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>Hummm... acho que fui vago demais! </div><div><br></div><div>Vamos ver se consigo me expressar melhor...</div><div>
<br></div><div><br></div><div>A pergunta é a seguinte: tudo o que eu passo de útil para o método 'validated_list' não tem nada a ver com \@_. Então por que eu preciso passar isso como referência? Referência de que?</div>

<div><br></div><div>Mesmo olhando o código do módulo, não consegui entender direito o que ele leva nessa referência, e ainda por cima, o método é estático! Que diabos tem dentro desse \@_ ? E como isso vai parar lá, já que não tem instância nenhuma do módulo, só um 'use'...(método estático, tá ligado?). Desconfio que a resposta tenha a ver com o 'use', mas não tenho certeza.</div>

<div><br></div><div><br></div><div>Acho que essa pergunta ficou um pouco 'menos pior'...</div><div><br></div><div><br></div><div>Eden???</div><div><br></div><div><br></div><div><br></div><div>Cheers!</div><div class="HOEnZb">
<div class="h5"><div><br>
</div><br><br><div class="gmail_quote">2012/12/3 Hernan Lopes <span dir="ltr"><<a href="mailto:hernanlopes@gmail.com" target="_blank">hernanlopes@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>O que acontece é o seguinte,</div><div>Veja o exemplo:</div><div><br></div><div>use Data::Printer;<br>                                                                                                                                                                                                                                <br>


sub params {</div><div>##<br># o usual seria algo assim:</div><div># my ( $self, $var1, $var2, $varX ) = @_;<br><br>##<br># mas tb é possível fazer assim:<br>    warn p @_; #tem os parametros acima<br>    my $self = shift; #tira o primeiro item da lista @_<br>


warn p @_; #imprime status atual da lista, sem o primeiro item que acaba de ser retirado<br>    my ( $var1, $var2, $varX ) = @_; #associa cada item da lista da esquerda ao correspondente na lista @_ da direita<br>    warn p $var1;<br>


    warn p $var2;<br>    warn p $varX;</div><div>##<br># e tambem é possível passar os parametros diretamente para outro metodo com \@_:</div><div># $self->metodo( \@_ );</div><div># ou, &metodo( \@_ ); </div><div>


# etc...<br>}<br><br>&params( 'SELF', {aa=>2}, {bb=>3}, {cc=>4} );<br></div><div><div><br><div class="gmail_quote">2012/12/3 Ulisses Montenegro <span dir="ltr"><<a href="mailto:ulisses.montenegro@gmail.com" target="_blank">ulisses.montenegro@gmail.com</a>></span><br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">André,<div><br></div><div>Faz tempo que não brinco com Perl, mas se a memória não falha, existiriam dois motivos legítimos para utilizar um parâmetro por referência (que é o que o \@_ representa, uma referência para o @_):</div>




<div><br></div><div>1. Modificar os valores originais, já que o comportamento padrão de Perl é passagem por valor e não por referência, ou</div><div>2. Evitar a cópia dos valores dos parâmetros (nesse caso seria mais uma otimização do que uma necessidade)</div>




<div><br></div><div>Como dizem os americanos, I might be putting my foot in my mouth, mas acho que seria isso. Para mais detalhes sobre o uso de referências em Perl, 'perldoc perlref'.</div><div><br></div><div>[]'s</div>




<div class="gmail_extra"><br><br><div class="gmail_quote">2012/12/3 Andre Carneiro <span dir="ltr"><<a href="mailto:andregarciacarneiro@gmail.com" target="_blank">andregarciacarneiro@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div><div>
<div>Boa noite!</div><div><br></div><div><br></div><div>Estou fazendo uma pesquisa sobre validação de parâmetros em métodos, para módulos que utilizam Moose. Encontrei a seguinte solução abaixo:</div><div><br></div><div>



<br>

</div><div><br></div><div><a href="http://search.cpan.org/~drolsky/MooseX-Params-Validate-0.16/lib/MooseX/Params/Validate.pm" target="_blank">http://search.cpan.org/~drolsky/MooseX-Params-Validate-0.16/lib/MooseX/Params/Validate.pm</a></div>





<div><br></div><div><br></div><div><br></div><div>No entanto, tem um detalhe que eu não compreendi. Porque eu preciso passar \@_ para o método 'validated_list' ?</div><div><br></div><div>Dei uma olhada no código, e vi que ele utiliza o primeiro parâmetro que é chamado de '$args' dentro do método e existe um algoritmo que faz uma série de verificações nessa variável e depois envia para validate_with, através do módulo Params::Validate. Lá descobri que 'validate_with' é um 'símbolo' que é interpretado como uma sub por um outro método, enfim... Tem alguém por aqui capaz de me ajudar a entender esta "bagunça" e, principalmente, porque do \@_ ?? </div>





<div><br></div><div><br></div><div>OBS: Antes de qualquer troll me interpretar mal, repare que coloquei 'bagunça' entre aspas, o que significa que não acho que isso realmente seja uma bagunça. Por favor, evitem comentários inúteis em cima disso! Já me considero velho e sem saco pra flames...  ;-)</div>





<div><br></div><div><br></div><div>Obrigado!</div><span><font color="#888888"><div><br></div><div><br></div><br clear="all"><div><br></div>-- <br>André Garcia Carneiro<br>Software Engineer<br><a href="tel:%2811%29982907780" value="+5511982907780" target="_blank">(11)982907780</a><br>





</font></span><br></div></div>=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>
<br></blockquote></div><span><font color="#888888"><br><br clear="all"><div><br></div>-- <br>“If debugging is the process of removing software bugs, then programming must be the process of putting them in.” - Edsger Dijkstra<br>




</font></span></div>
<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>
<br></blockquote></div><br>
</div></div><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>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>André Garcia Carneiro<br>Software Engineer<br><a href="tel:%2811%29982907780" value="+5511982907780" target="_blank">(11)982907780</a><br>
</div></div><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">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>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>“If debugging is the process of removing software bugs, then programming must be the process of putting them in.” - Edsger Dijkstra<br>
</div>