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

Luis Motta Campos luismottacampos em yahoo.co.uk
Sexta Fevereiro 29 11:57:21 PST 2008


André Garcia Carneiro wrote:
> 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?


Eu sou literatura sobre o assunto, modéstia à parte. ;)

http://c2.com/cgi/wiki?LexicalClosure

Aqui tem a teoria, e um pouco mais sobre a idéia por trás de 
sub{some_function()}.

Agora vamos ver se eu consigo te dar um sumário executivo:

Acho que você entende que sub{} e \&some_code são ambos referências para 
uma subrotina em Perl, certo?

Isso é a base. Sobre isso, tem duas formas de aproximar o problema:

1. Usar uma referência para uma subrotina que existe

Se você pode passar os parâmetros mais tarde, pode usar \&some_code sem 
medo de ser feliz. Você pode sempre chamar a mesma rotina mais tarde e 
passar os parâmetros que você precisa. Mas isso pode querer dizer 
percorrer uma grande lista de dados para separar os parâmetros, ou, por 
qualquer outra razão, você pode ter os parâmetros já definidos.

Aqui, vale à pena olhar para a outra forma de resolver o problema:

2. Criar uma "bolha de tempo" que contém a chamada que você quer fazer 
mais tarde

Se você sabe que rotina chamar, e tem os parâmetros para isso, mas ainda 
não quer executar a chamada (como no caso do seu menu), pode sempre 
criar uma referência para uma subrotina anônima que executa a chamada 
que você quer com os parâmetros que você tem, e guardar para executar 
mais tarde. :) Foi isso que eu sugeri que você fizesse com

$code_ref = sub { outra_coisa( $param1, $param2 ) };

Espero que você entenda um pouco mais desta vez, André.
Vale à pena fazer uns testes, para você sacar como a coisa funciona.

Continue perguntando, que este assunto é complicado, mas é também um 
grande salto na tua qualidade de código.

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