Question

Quel est le meilleur moyen de découvrir par programmation tous les sous-programmes d’un module Perl? Cela peut être un module, une classe (pas de @EXPORT) ou autre chose entre les deux.

Modifier: Toutes les méthodes ci-dessous semblent fonctionner. J'utiliserais probablement le Class :: Sniff ou le Class :: Inspector en production. Cependant, la réponse de Leon est marquée comme "acceptée" car elle répond à la question telle que posée, même si aucune "référence" stricte ne doit être utilisée. :-) Class :: Sniff peut être un bon choix à mesure que vous avancez; il semble y avoir beaucoup de réflexion.

Était-ce utile?

La solution

sub list_module {
    my $module = shift;
    no strict 'refs';
    return grep { defined &{"$module\::
use B qw/svref_2object/;

sub in_package {
    my ($coderef, $package) = @_;
    my $cv = svref_2object($coderef);
    return if not $cv->isa('B::CV') or $cv->GV->isa('B::SPECIAL');
    return $cv->GV->STASH->NAME eq $package;
}

sub list_module {
    my $module = shift;
    no strict 'refs';
    return grep { defined &{"$module\::
sub list_module {
    my $module = shift;
    no strict 'refs';
    return grep { defined &{"$module\::<*>

ETA: si vous souhaitez filtrer les sous-routines importées, vous pouvez le faire

<*>"} } keys %{"$module\::"} }

ETA: si vous souhaitez filtrer les sous-routines importées, vous pouvez le faire

<*>"} and in_package(\&{*
sub list_module {
    my $module = shift;
    no strict 'refs';
    return grep { defined &{"$module\::<*>

ETA: si vous souhaitez filtrer les sous-routines importées, vous pouvez le faire

<*>"} } keys %{"$module\::"} }

ETA: si vous souhaitez filtrer les sous-routines importées, vous pouvez le faire

<*>}, $module) } keys %{"$module\::"} }

ETA: si vous souhaitez filtrer les sous-routines importées, vous pouvez le faire

<*>"} } keys %{"$module\::"} }

ETA: si vous souhaitez filtrer les sous-routines importées, vous pouvez le faire

<*>

Autres conseils

Classe :: Inspecteur :

  

Class :: Inspector vous permet d'obtenir des informations sur une classe chargée. La plupart ou la totalité de ces informations peuvent être trouvées sous d'autres formes, mais elles ne sont pas toujours très conviviales et impliquent généralement un niveau relativement élevé de magie Perl, ou un code étrange et inhabituel. Class :: Inspector tente de fournir une interface plus simple et plus conviviale pour ces informations ...

Regardez ceci: Classe :: Sniff

  

L’interface est plutôt ad-hoc pour le moment et est susceptible de changer. Après avoir créé une nouvelle instance, l’appel à la méthode de rapport est votre meilleure option. Vous pouvez ensuite l'examiner visuellement pour rechercher d'éventuels problèmes:

my $sniff = Class::Sniff->new({class => 'Some::Class'});
print $sniff->report;
     

Ce module tente d'aider les programmeurs à trouver des "odeurs de code" dans le code orienté objet. S'il signale quelque chose, cela ne signifie pas que votre code est erroné. Cela signifie simplement que vous voudrez peut-être examiner votre code de plus près pour voir si vous avez des problèmes.

     

À l'heure actuelle, nous supposons que l'ordre de recherche par défaut le plus à gauche et le plus profond de Perl est celui par défaut. Nous pourrions modifier cela à l'avenir (et il existe une solution de contournement avec la méthode des chemins. Plus de détails à ce sujet plus tard) ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top