[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