[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