44 votes

Comment répertorier les méthodes disponibles sur un objet ou un package donné en Perl?

Comment répertorier les méthodes disponibles sur un objet ou un package donné en Perl?

40voto

Nic Gibson Points 4539

Il y a (plutôt trop) de nombreuses façons de le faire en Perl car 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 délicates. Cependant, plutôt que de rouler votre propre approche, je vous suggère de jeter un œil à Class :: Inspector sur CPAN. Cela vous permettra de faire quelque chose comme:

 my @methods =   Class::Inspector->methods( 'Foo::Class', 'full', 'public' );
 

23voto

Chris Lutz Points 34157

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 defined &{$_}; # check if symbol is method
}
use strict 'refs';
 

Alternativement, pour obtenir une liste de toutes les méthodes:

 no strict 'refs';
my @methods = grep { defined &{$_} } keys %Foo::;
use strict 'refs';
 

13voto

Kent Fredric Points 35592

si vous avez un package à l'aide de l'Orignal son assez simple:

print PackageNameHere->meta->dump;

Et pour des informations plus complètes:

use Data::Dumper;
print Dumper( PackageNameHere->meta );

Vous permettra de commencer. Pour tout le reste, il y a les méthodes qui apparaissent sur ->meta sont documentées dans la Classe::MOP::Classe

Vous pouvez faire un peu de AdHoc semblant de moose bonté pour les forfaits sans avec:

use Class::MOP::Class;
my $meta = Class::MOP::Class->initialize( PackageNameHere );

et puis faire usage de la Classe::MOP méthodes comme vous le feriez avec l'Orignal.

Pour commencer:

 $meta->get_method_map();

l'utilisation de l'Orignal; #, à son génial.

3voto

brian d foy Points 71781

En général, vous ne pouvez pas faire cela avec un langage dynamique comme Perl. Le package peut définir certaines méthodes que vous pouvez trouver, mais il peut également créer à la volée des méthodes qui n'ont pas de définitions jusqu'à ce que vous les utilisiez. De plus, même appeler une méthode (qui fonctionne) peut ne pas la définir. C'est le genre de choses qui rendent les langages dynamiques agréables. :)

Quelle tâche essayez-vous de résoudre?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X