[Cascavel-pm] Várias Variações de Variáveis...

Flavio S. Glock fglock em gmail.com
Quarta Junho 20 14:28:35 PDT 2007


Em 20/06/07, Alceu Rodrigues de Freitas
Junior<glasswalk3r em hotmail.com> escreveu:
>
> Para seu exemplo, isso poderia ser feito facilmente usando usando "local" e
> mantendo o valor original. Eu sugeri o uso de uma variável global apenas se
> fosse necessário guardar o resultado calculado dentro do bloco BEGIN. Para o
> caso de apenas imprimir o valor, nem isso é necessário.

Faz sentido, mas o problema é mesmo um pouco mais complicado:
Não precisamos nem trocar de exemplo.

Vamos ver o programa do ponto de vista do compilador.
Imagine uma sequencia de chamadas de subrotinas:

  abre_bloco;
  declara_var_lexica( '$x' );
  atribui( '$x', 1 );
  # ...
  fecha_bloco;

Para executar uma sequência de comandos assim, você não consegue usar
'local' dentro das subrotinas.
Porque o 'local' retorna ao valor anterior no fim do bloco.
Isso quer dizer que, ao executar a próxima instrução, o valor de $x
não existiria mais.

Uma possibilidade seria fazer um eval() neste código:

  {
  local $My::x;
  atribui( '$x', 1 );
  # ...
  }

mas isso não é possível, porque o programa precisa necessariamente ser
lido e executado passo-a-passo.
Quer dizer, você só sabe o próximo comando depois que já executou o anterior.
Não pode usar { } porque você precisaria colocar todos os comandos
dentro, mas você ainda não sabe os comandos.

certo?


Mais detalhes sobre a lista de discussão Cascavel-pm