[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