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

Responder a