[SP-pm] Executar uma 'sub' a partir de um hashref
André Garcia Carneiro
andre.garcia.carneir em terra.com.br
Sexta Fevereiro 29 09:47:17 PST 2008
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?
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
Mais detalhes sobre a lista de discussão SaoPaulo-pm