[Cascavel-pm] Re: Digest Cascavel-pm, volume 25, assunto 4

Graciliano M. P. gmpowers em terra.com.br
Sexta Janeiro 9 13:36:38 CST 2004


> Tipo, estou com uma dúvida.
> Existe alguma maneira de apagar os valores de todas as variáveis
existentes?
> Algo no estilo undef $*;
> Sei lá.. é que, como sabem, alguns valores ficam salvo na memória quando
utilizado o mod_perl e pra evitar que estes valores implicassem em erros em
execuções posteriores, preciso tirar tais valores.
> O uso do my não é viável, já que utilizo um arquivo de complemento com as
funções principais e o chamo através do require, e caso eu esteja usando o
my, as variáveis do arquivo em questão não são > > passadas pro script que
está sendo executado.
>
> Espero ter sido 'entendível' :)
>
> Abraços a todos ;)
>
> Gabriel Vieira

Vc pode dar uma olhada na função reset(), mas não é muit utilizada, pois vc
define uma faixa para os nomes da variáveis. Dê uma olhada em:
http://www.perldoc.com/perl5.8.0/pod/func/reset.html

Ou podes utilizar uma função que scaneia a tabela de símbolos retornando
apenas as variáveis globais, e depois dar undef em cada uma:

## Adaptado de Safe::World::scanpack_table()
sub scanvars {
  my ( $packname ) = @_ ;

  $packname .= '::' unless $packname =~ /::$/ ;
  no strict "refs" ;
  my $package = *{$packname}{HASH} ;
  return unless defined $package ;

  no warnings ;
  local $^W = 0 ;

  my @table ;

  my $fullname ;
  foreach my $symb ( keys %$package ) {
    $fullname = "$packname$symb" ;
    if ( $symb !~ /::$/ && $symb !~ /[^\w:]/ && $symb !~ /^\d$/ && $symb !~
/^(?:INC|ENV|SIG|ARGV|_)$/ ) {
      my $ok ;
      if (defined $$fullname) { push(@table , "\$$fullname") ; $ok = 1 ;}
      if (defined %$fullname) { push(@table , "\%$fullname") ; $ok = 1 ;}
      if (defined @$fullname) { push(@table , "\@$fullname") ; $ok = 1 ;}
      if (defined &$fullname) { $ok = 1 ;}
      if (*{$fullname}{IO} && fileno $fullname) { $ok = 1 ;}
      if (!$ok && $symb !~ /^(?:BEGIN|END|INIT)$/ ) { push(@table ,
"\$$fullname") ;}
    }
  }

  return( @table ) ;
}

$global_x = 123 ;

my @vars = scanvars('main');

foreach my $vars_i ( @vars ) {
  eval("undef $vars_i ;") ;
}


Agora quanto a estrutura do seu programa eu a abomino completamente,
principalmente por ser executado em mod_perl, que foi feito para módulos OO!
Procure utilizar Orientação a Objetos, vc vai ver que o mundo pode ser bem
melhor.

Atenciosamente,
Graciliano M. P.






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