Comment puis-je lister les méthodes disponibles sur un objet ou un paquet donné en Perl?Comment puis-je lister les méthodes disponibles sur un objet ou un paquet donné en Perl?
Répondre
Si vous avez un paquet appelé Foo, cela devrait le faire:
no strict 'refs';
for(keys %Foo::) { # All the symbols in Foo's symbol table
print "$_\n" if exists &{"Foo::$_"}; # check if symbol is method
}
use strict 'refs';
Sinon, pour obtenir une liste de toutes les méthodes:
no strict 'refs';
my @methods = grep { defined &{$_} } keys %Foo::;
use strict 'refs';
Il y a (un peu trop) de nombreuses façons de Faites cela en Perl parce qu'il y a tellement de façons de faire les choses en Perl. Comme quelqu'un l'a commenté, les méthodes chargées automatiquement seront toujours un peu compliquées. Cependant, plutôt que de lancer votre propre approche, je vous suggère de jeter un coup d'œil sur le CPAN au Class::Inspector. Cela vous permettra de faire quelque chose comme:
my @methods = Class::Inspector->methods('Foo::Class', 'full', 'public');
J'ai finalement inclus dans mon script un fichier Class :: Inspector en ligne, c'est en fait la solution la plus simple. Merci. –
Notez que Class :: Inspector a des limitations. Il peut voir les méthodes définies, mais ne gère rien dans UNIVERSAL. –
Ce n'est pas comme la réponse acceptée gère UNIVERSAL soit ... – ephemient
si vous avez un paquet qui utilise Moose son assez simple:
print PackageNameHere->meta->dump;
Et pour les données plus complète:
use Data::Dumper;
print Dumper(PackageNameHere->meta);
obtiendrai vous avez commencé. Pour tout le reste, theres les méthodes qui apparaissent sur ->meta
qui sont documentés dans Class::MOP::Class
Vous pouvez faire un peu de AdHoc trucage de bonté à l'orignal pour les paquets sans avec:
use Class::MOP::Class;
my $meta = Class::MOP::Class->initialize(PackageNameHere);
et passer ensuite à utiliser la Class :: MOP méthodes comme vous le feriez avec Moose.
Pour commencer:
$meta->get_method_map();
utilisation Moose; #, son impressionnant.
initialize retourne la métaclasse si elle est en cache, pas besoin de vérifier manuellement, voir par exemple les implémentations pour tout le sucre dans Moose.pm – perigrin
Hmm et avec une enquête plus approfondie, je semble être à la fois vrai et faux. Class :: MOP :: class_of() gère les instances ainsi que les noms de classe, tandis que la fonction qui initialise utilise (Class :: MOP :: get_metaclass_by_name()) * seulement * gère les noms de classe. – perigrin
Kent - cela ne fonctionne pas pour moi - peut-être que quelque chose a changé dans le monde Moose. J'ai un aperçu ici: https://gist.github.com/rjattrill/6119205 –
En général, vous ne pouvez pas le faire avec un langage dynamique comme Perl. Le paquet peut définir certaines méthodes que vous pouvez trouver, mais il peut également créer des méthodes à la volée qui n'ont pas de définitions jusqu'à ce que vous les utilisiez. De plus, même l'appel d'une méthode (qui fonctionne) peut ne pas le définir. C'est le genre de choses qui rendent les langages dynamiques agréables. :)
Quelle tâche tentez-vous de résoudre?
- 1. Comment lister les fichiers installés par un Windows Installer donné?
- 2. Comment lister les modes vidéo disponibles en utilisant C#?
- 3. Comment lister toutes les fonctions dans un module Python?
- 4. Existe-t-il un moyen de lister toutes les lettres de lecteur disponibles en python?
- 5. Javascript permet de lister les plugins disponibles pour IE
- 6. Comment puis-je calculer la probabilité à un point donné une distribution normale en Perl?
- 7. Comment puis-je lister les méthodes d'un objet JavaScript dans la fenêtre de commande VS?
- 8. Importer un paquet ou un chargement automatique pour PHP?
- 9. Passer un paquet sur startActivity()?
- 10. Comment trouvez-vous les commutateurs de débogage disponibles? Ou donné un commutateur savoir ce qui est désactivé?
- 11. Comment puis-je obtenir un caractère à un index donné en Perl?
- 12. Comment puis-je lister les méthodes dans un module Python 2.5?
- 13. Question Obj-C de base: Méthodes d'appel sur un objet
- 14. Lister les processus pour un utilisateur spécifique
- 15. Comment utiliser libapt (ou libept) dans un système de type debian pour lister les paquets et obtenir leurs infos?
- 16. Comment appeler une méthode générique avec un objet Type donné?
- 17. Comment lister les objets actuellement disponibles dans la portée actuelle dans ruby?
- 18. Est-ce que ce comportement Perl peut être émulé avec un commutateur/cas ou donné/quand?
- 19. Séparer les méthodes objet des données objet
- 20. API pour lister les fichiers sur un périphérique Windows Mobile
- 21. Comment corriger ou effacer un objet Javascript?
- 22. Gestionnaire de clics JQuery pour tout sauf un objet donné
- 23. Existe-t-il un moyen de récupérer un ensemble ou un tableau de clés pour un objet NSManagedObject donné?
- 24. Étant donné un XSD est-il possible de lister une hiérarchie d'éléments et leurs attributs?
- 25. Existe-t-il un moyen de lister les serveurs PostgreSQL?
- 26. Dans VB6, comment appeler un objet COM nécessitant un pointeur sur un objet?
- 27. Différentes façons d'écrire sur un élément donné en utilisant jquery
- 28. Comment tracer ou déboguer tous les événements javascript disponibles
- 29. Étant donné un objet, comment puis-je dire par programme quelles interfaces il prend en charge?
- 30. Comment lister les fichiers dans un répertoire statique?
Doit récursivité des baies @ISA ainsi – Beano
Test sur XML :: Simple, Scalar :: Util et Exporter montre toutes les méthodes explicitement exportées. Récursif @ISA ne devrait pas être si difficile, cependant. –
Bien sûr, vous aurez du mal à trouver des méthodes chargées automatiquement. – innaM