Comment puis-je liste toutes les variables qui sont dans une portée?
Je sais que je peux la liste de tous les colis et lexcial de variables dans une étendue donnée à l'aide de Padwalker
's peek_our
et peek_my
, mais comment puis-je obtenir les noms et les valeurs de toutes les variables globales comme $"
et $/
?
#!/usr/bin/perl
use strict;
use warnings;
use PadWalker qw/peek_our peek_my/;
use Data::Dumper;
our $foo = 1;
our $bar = 2;
{
my $foo = 3;
print Dumper in_scope_variables();
}
print Dumper in_scope_variables();
sub in_scope_variables {
my %in_scope = %{peek_our(1)};
my $lexical = peek_my(1);
#lexicals hide package variables
while (my ($var, $ref) = each %$lexical) {
$in_scope{$var} = $ref;
}
##############################################
#FIXME: need to add globals to %in_scope here#
##############################################
return \%in_scope;
}
Vous devez vous connecter pour publier un commentaire.
Vous pouvez accéder à la table des symboles, découvrez p. 293 de "Programmation Perl"
Regardez aussi "la maîtrise de Perl: http://www252.pair.com/comdog/mastering_perl/
Plus précisément: http://www252.pair.com/comdog/mastering_perl/Chapters/08.symbol_tables.html
Ces variables vous êtes à la recherche pour le sera dans l'espace principal
Une rapide recherche sur Google m'a donné:
Vous pouvez également faire
et de même pour les autres valeurs
Si vous voulez trouver le type de symbole que vous pouvez faire (de la maîtrise de l'perl):
Et qui le fait. Grâce à MGoDave et kbosak pour fournir la réponse en face de mon visage que j'étais trop stupide pour voir (j'ai regardé en %principale:: pour commencer, mais il a manqué qu'ils n'ont pas de cachets). Voici le code complet:
Vous pouvez faire quelque chose comme suit pour vérifier la table des symboles du paquet principal:
Merci, Chas, très utile code.
Comme une note pour les futurs utilisateurs de votre code avec perl > 5.12:
Je l'utilise dans mon pdl2 .perldlrc pour en savoir lexical variables (comme le " y " de commande dans le débogueur) et j'ai eu cet avertissement:
De perldoc -f définie
Ce que je ne comprends pas, c'est pourquoi il ne s'est plaint à la définition de hachage et pas aussi avec le tableau?
perl -we '@a = defined @a'
ne semble pas déclencher, maisperl -we '%h = (1,defined %h)'
certainement déclencher une alerte. Cela sent comme un bug de certaine forme.perl -wE 'my @a;say defined @a ? @a : "f"'
, mais pas cetteperl -wE 'our @a;say defined @a ? @a : "f"'
. Ce qui semble dire que seuls les réels lexicale variables jeter l'avertissement.