En Perl, est-il possible de créer une variable globale basée sur une chaîne?Comment puis-je créer un nom de variable Perl basé sur une chaîne?
Par ex, si j'avais une fonction comme:
sub create_glob_var {
my ($glob_var_str) = @_;
# something like this (but not a hash access).
our ${$glob_var_str};
};
et je l'ai appelé comme:
create_glob_var("bar");
Comment pourrais-je modifier create_glob_var
réellement créer une variable globale appelée $bar
?
Mon projet utilise perl 5.8.5.
EDIT
Ce qui suit ne fonctionne pas:
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";
Produit:
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.
NOTE je me rends compte que l'utilisation des variables globales provoque ozone depletion and male pattern baldness. J'essaie de nettoyer un code hérité qui est déjà complètement infecté par l'utilisation de variables globales. Un refactor à la fois ...
Le sous-programme crée la variable globale, mais vous devez toujours y accéder d'une manière acceptable à strict, probablement l'un de 1) $ Mon :: Package :: bah = "blah", 2) utiliser vars qw ($ bah) $ bah = "blah", ou 3) notre $ bah = "blah". – Sean
Ne faites pas ce genre de choses. voir http://stackoverflow.com/questions/1549685/how-can-i-use-a-variable-as-a-variable-name-in-perl –
D'accord. Utilisez un hash global pour stocker des données (si vous devez utiliser des globals du tout), plutôt que de créer de nouveaux scalaires! – Ether