En Perl, ¿es posible crear una variable global basada en una cadena?¿Cómo puedo crear un nombre de variable Perl basado en una cadena?
por ejemplo, si tuviera una función como:
sub create_glob_var {
my ($glob_var_str) = @_;
# something like this (but not a hash access).
our ${$glob_var_str};
};
y lo llamé gustaría:
create_glob_var("bar");
¿Cómo podría modificar create_glob_var
para realmente crear una variable global llamada $bar
?
Mi proyecto está utilizando perl 5.8.5.
EDITAR
El siguiente no funciona:
use strict;
BEGIN {
sub create_glob_var {
my ($glob_var_str) = @_;
no strict 'refs';
$$glob_var_str = undef; # or whatever you want to set it to
}
create_glob_var("bah");
};
$bah = "blah";
Produce:
Variable "$bah" is not imported at /nfs/pdx/home/rbroger1/tmp2.pl line 12. Global symbol "$bah" requires explicit package name at /nfs/pdx/home/rbroger1/tmp2.pl line 12. Execution of /nfs/pdx/home/rbroger1/tmp2.pl aborted due to compilation errors.
NOTA que darse cuenta de que el uso de variables globales hace que ozone depletion and male pattern baldness. Estoy tratando de limpiar algún código heredado que ya está completamente infectado con el uso de variables globales. Un refactor a la vez ...
La subrutina crea la variable global, pero aún necesita acceder de manera aceptable a estricta, probablemente una de 1) $ My :: Package :: bah = "blah", 2) use vars qw ($ bah); $ bah = "blah", o 3) nuestro $ bah = "blah". – Sean
No hagas cosas como esta. ver http://stackoverflow.com/questions/1549685/how-can-i-use-a-variable-as-a-variable-name-in-perl –
De acuerdo. Use un hash global para almacenar datos (si debe usar globales), ¡en lugar de crear nuevos escalares! – Ether