J'essaie d'obtenir une représentation de texte d'une variable. Par exemple, ce serait la fonction que je recherche: Je veux cela parce que j'essaie d'écrire une fonction de débogage qui génère récursivement le contenu d'une variable passée, je le veux Sortie Le nom de la variable avant la main, donc si j'appelle cette fonction de débogage 100 fois successivement, il n'y aura aucune confusion quant à la variable que je regarde dans la sortie. P> J'ai entendu parler de données :: Dumper et Je ne suis pas un fan. Si quelqu'un peut me dire comment s'il est possible, obtenez une chaîne de nom de variable, ce serait génial. P> merci! P> p>
3 Réponses :
"Mes" Les noms de variables "(lexicales) sont effacés, vous ne pouvez donc pas obtenir leur nom. Les noms de variables de paquet sont disponibles via l'entrée de la table de symboles ( * var code>), comme mentionné ElsearTle. P>
Ce n'était certainement pas la question. Et il y a un moyen d'obtenir des noms de variables lexicales et globales utilisées dans un appel. Regardez les autres réponses. Regardez Devel :: Caller et Padwalker.
use warnings; use strict; use Data::Dumper::Simple; my $abc = '123'; my ($var_name) = split /=/, Dumper($abc); print $var_name, "\n"; __END__ $abc
Pour ce faire, vous devez utiliser le module Padwalker , ce qui vous permet d'inspecter le lexical Pads qui stockent des variables.
use PadWalker qw/peek_my peek_our/; sub get_name_my { my $pad = peek_my($_[0] + 1); for (keys %$pad) { return $_ if $$pad{$_} == \$_[1] } } sub get_name_our { my $pad = peek_our($_[0] + 1); for (keys %$pad) { return $_ if $$pad{$_} == \$_[1] } } sub get_name_stash { my $caller = caller($_[0]) . '::'; my $stash = do { no strict 'refs'; \%$caller }; my %lookup; for my $name (keys %$stash) { if (ref \$$stash{$name} eq 'GLOB') { for (['$' => 'SCALAR'], ['@' => 'ARRAY'], ['%' => 'HASH'], ['&' => 'CODE']) { if (my $ref = *{$$stash{$name}}{$$_[1]}) { $lookup{$ref} ||= $$_[0] . $caller . $name } } } } $lookup{\$_[1]} } sub get_name { unshift @_, @_ == 2 ? 1 + shift : 1; &get_name_my or &get_name_our or &get_name_stash } sub debug { for (@_) { my $name = get_name(1, $_) || 'name not found'; print "$name: $_\n"; } }
Pourquoi ne pas simplement utiliser les outils de débogage intégrés de Perl au lieu de réinventer la roue?
Je soupçonne que devel :: StackTrace serait une meilleure solution à votre problème puis chasser les noms variables.
Pourquoi n'êtes-vous pas fan de données :: Dumper? Si nous savons exactement quelles sont vos exigences et pourquoi les données :: Dumper ne les satisfont pas, il sera plus facile de répondre à votre question. Sans plus d'informations, tout ce que je peux faire, c'est recommander des données :: Dumper parce que c'est ce que j'utilise pour cela.
Je ne vois pas réellement quelles données d'aide :: Dumper serait dans ce cas.