[SP-pm] Executar uma 'sub' a partir de um hashref

Solli Honorio shonorio em gmail.com
Sexta Fevereiro 29 10:22:34 PST 2008


Em 29/02/08, André Garcia Carneiro <andre.garcia.carneir em terra.com.br>
escreveu:
>
> Valeu Champs, funcionou!
>
> champs++
>
> Mas eu gostaria de aprender mais sobre isso, pois não ficou claro o
> conceito sobre as diferenças entre
> 'sub{&op}' e 'my $cmd = \&op;'. Onde tem literatura sobre isso?


Se eu compreendi a dúvida, no 'sub{&op}' você cria uma sub-anônima (coderef)
executando a sub 'op'. Já no 'my $cmd = \&op;' você está atribuindo a
referência da sub '&op' a variável.

O perlref mostra a questão do coderef.

Solli


Solução abaixo:
>
> <code>
> use strict;
> .
> .
> .
> sub applyrule {
>         use Date::Calc qw( :all );
>         my ($date,$rule) = @_;
>         $rule = lc $rule;
>         $rule = ucfirst $rule;
>         if(!$date || !$rule){
>                 throw Error::applyRule(-text => "Está(ão) faltando
> parâmetro(s)",-errortarget => "DATE:".$date.", RULE: ".$rule);
>         }
>         else{
>                 my ($operation,$quantifier) = split /\ +/,$rule;
>                 my $cmd_table = {'Add'          => sub{&Add_Delta_Days;}
>                                 ,'Sub'          => sub{$quantifier *=
> -1;&Add_Delta_Days;}
>                                 };
>                 ($date->{year},$date->{month},$date->{day}) =
>
> $cmd_table->{$operation}->($date->{year},$date->{month},$date->{day},$quantifier);
>                 return
> $date->{year}.$separator.sprintf('%02d',$date->{month}).$separator.sprintf('%02d',$date->{day});
>         }
> }
> .
> .
> .
>
> </code>
>
>
>
> Cheers!
>
>
> ---------- Cabeçalho original -----------
>
> De: saopaulo-pm-bounces+andre.garcia.carneir=terra.com.br em pm.org
> Para: saopaulo-pm em mail.pm.org
> Cópia:
> Data: Fri, 29 Feb 2008 16:57:01 +0100
> Assunto: Re: [SP-pm] Executar uma 'sub' a partir de um hashref
>
>
> > André Garcia Carneiro wrote:
> > > Estou tentando fazer o seguinte. Eu tenho uma série de opções que o
> > > meu usuário pode colocar como 'input', e gostaria de processá-las
> > > como algo parecido com o código abaixo:
> >
> > > <code>
> >  > use strict;
> >  > my $cmd_table = {'Add',\&add(1,2)};
> > >
> > > sub add { my ($v1,$v2) = @_;
> > >   my $result = $v1 + $v2; return $result;
> > > }
> > >
> > > </code>
> >
> > André, não se pode criar referências para subrotinas passando parâmetros
> > fixos desta forma. Se você quer uma referência para uma subrotina, use
> >
> > $coderef = \&minha_sub;
> >
> > Agora, se você precisa realmente dos parâmetros, você precisa usar um
> > "closure":
> >
> > my $coderef_with_parameters = sub { minha_sub( $a, $b ); };
> >
> > Isso vai fazer com que minha_sub( $a, $b ) seja chamada com os valores
> > que estavam em $a e $b no momento da atribuição a
> $coderef_with_parameters.
> >
> > > Claro que é só um exemplo. Mas o problema é que não estou entendendo
> > > como executar, e capturar o valor, quando chamo a sub 'add'. Por
> > > exemplo:
> > >
> > > <code>
> > >  my $userinput = shift;
> >  >  my $result = $cmd->{$userinput};
> > > </code>
> >
> > OK, se você quer executar mais tarde, precisa usar uma das duas
> > alternativas acima, e, dependendo de qual você for usar aqui, faz assim:
> >
> > Se tiver escolhido guardar uma referência para a subrotina e não
> > parâmetros, você vai precisar passar parâmetros na hora de executar:
> >
> > $valor = $coderef->( $a, $b ); # executa como se fosse uma sub comum
> >
> > ou, se você escolheu usar a segunda forma, e guardar closures com a
> > chamada que você precisa fazer, pode chamar simplesmente a subrotina,
> > sem parâmetros (já estão no lugar certo desde que você guardou a
> > referência para a closure:
> >
> > $valor = $coderef_with_parameters->(); # não precisa de parâmetros
> >
> > > Alguém poderia me corrigir/explicar o que está acontecendo aqui, para
> > > que eu possa tentar fazer funcionar?
> >
> > Bom, eu acho que você agora sabe o que está acontecendo, e como corrigir
> > o problema :) se você tiver perguntas, eu sei que você não vai deixar de
> > fazê-las. ;)
> >
> > Putamplexos!
> > --
> > Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
> > Perl fanatic evangelist, and amateur {cook, photographer}
> > _______________________________________________
>
> > SaoPaulo-pm mailing list
> > SaoPaulo-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/saopaulo-pm
> >
>
>
> --
> André Garcia Carneiro
> Developer(Perl/PHP)
> Member of "São Paulo Perl Mongers" - http://sao-paulo.pm.org
>
> _______________________________________________
>
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>



-- 
"o animal satisfeito dorme". - Guimarães Rosa
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/saopaulo-pm/attachments/20080229/560a5d1d/attachment.html 


Mais detalhes sobre a lista de discussão SaoPaulo-pm