[SP-pm] Executar uma 'sub' a partir de um hashref
Luis Motta Campos
luismottacampos em yahoo.co.uk
Sexta Fevereiro 29 07:57:01 PST 2008
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}
Mais detalhes sobre a lista de discussão SaoPaulo-pm