Alexei, Isto está no Capítulo 9, 'Argument Lists', e na verdade o PBP diz que você não deve manipular diretamente os valores recebidos do @_ pois vai alterar o original, mesmo não passando via referencia direta, vc está sim recebendo 'um ponteiro' (desculpe os purista, mas não encontrei outro nome para isto).
<code> my $a='foo'; failure($a); print "$a\n"; sub failure { $_[0] = 'Perdeu !'; } </code> então se eu fizer 'my $param = eval { validate(@,...) }' estou fazendo o que o PBP sugere. Faz o 'unpack', e valide os parâmetros nomeados. Solli Honorio Em 21 de junho de 2012 13:59, Alexei Znamensky <rus...@gmail.com> escreveu: > > > 2012/6/21 Solli Honorio <shono...@gmail.com> > >> Pessoal, >> >> Este é apenas um compartilhamento de experiência que pode ser útil aos >> demais, sobre a minha frustação do perl não ter um try-catch de leitura >> simples e nativo. >> >> Tenho observado que o Try::Tiny está sendo utilizado em vários módulos >> sérios e com grande utilização, em substituição ao eval{ ... } (já que >> apenas os letrados em perl entende isto). >> >> As coisas estavam encaminhando bem, até que eu resolvi 'melhorar o meu >> código' e passei a ter uma coisa do tipo : >> >> <code> >> use Try::Tiny; >> use Params::Validate qw(:all); >> >> sub foo { >> my $self = shift; >> my $param = try { validate(@_, { name => { SCALAR } } ) } catch { ... }; >> >> ... >> >> } >> </code> >> >> E aí todos os meus teste falharam, depois de algumas análise descobri >> (sem muita surpresa) que o try { } localiza o @_ (claro, isto é um função >> qualquer) e com valor inválido. Este problema eu não tenho com o eval { }. >> > > Solli, só para fazer o advogado-do-diabo-eu-te-disse-eu-te-disse, a Boa > Prática (R), preconizada pelo PBP, leia-se Perl::Critic, prega que você > deve ***sempre*** copiar (acho que o termo que eles usam é desempacotar, > mas eu acho mais coerente chamar de cópia, pois é efetivamente uma cópia). > Ou seja, para ser um bom menino, você deveria ter feito: > <code> > use Try::Tiny; > use Params::Validate qw(:all); > > sub foo { > my $self = shift; > my @array = @_; > my $param = try { validate(@array, { name => { SCALAR } } ) } catch { > ... }; > > ... > > } > </code> > > Mas bons meninos não tomam tanta cerveja quanto você. ;-) > > []s, > Russo > > > >> >> Bom, eu ainda vou continuar a utilizar o Try::Tiny, por enquanto, mas é >> neste momento que a gente percebe que estes 'quebra-galho' no perl é chato ! >> >> Solli Honorio >> >> >> -- >> "o animal satisfeito dorme". - Guimarães Rosa >> >> =begin disclaimer >> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ >> SaoPaulo-pm mailing list: SaoPaulo-pm@pm.org >> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> >> =end disclaimer >> >> > > > -- > Alexei "RUSSOZ" Znamensky | russoz EM gmail com | http://russoz.org > GPG fingerprint = 42AB E78C B83A AE31 7D27 1CF3 C66F B5C7 71CA 9F3C > http://www.flickr.com/photos/alexeiz | http://github.com/russoz > "I don't know... fly casual!" -- Han Solo > > =begin disclaimer > Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ > SaoPaulo-pm mailing list: SaoPaulo-pm@pm.org > L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> > =end disclaimer > > -- "o animal satisfeito dorme". - Guimarães Rosa
=begin disclaimer Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ SaoPaulo-pm mailing list: SaoPaulo-pm@pm.org L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> =end disclaimer