Frage

Was ist der beste Weg, um programmatisch ein Perl-Modul verfügt über alle Subroutinen zu entdecken? Dies könnte ein Modul sein, eine Klasse (kein @EXPORT), oder irgendetwas dazwischen.

Edit: Alle Methoden unten schauen, wie sie funktionieren. Ich würde wahrscheinlich die Klasse verwenden :: Sniff oder Klasse :: Inspektoren in der Produktion. Allerdings ist Leons Antwort markiert als ‚akzeptiert‘, da es die Frage aufgeworfen beantwortet, obwohl no strict 'refs' verwendet werden muss. :-) Class :: Sniff kann eine gute Wahl sein, da sie fortschreitet; es sieht aus wie eine Menge Gedanken hat drinsteckt.

War es hilfreich?

Lösung

sub list_module {
    my $module = shift;
    no strict 'refs';
    return grep { defined &{"$module\::$_"} } keys %{"$module\::"}
}

ETA: Wenn Sie importierte Subroutinen herausfiltern möchten, können Sie dies tun

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\::$_"} and in_package(\&{*$_}, $module) } keys %{"$module\::"}
}

Andere Tipps

Class :: Inspector :

  

Class :: Inspector können Sie Informationen über eine geladene Klasse erhalten. Die meisten oder alle diese Informationen auf andere Weise zu finden, aber sie sind nicht immer sehr freundlich, und in der Regel ein relativ hohes Maß an Perl wizardry beinhalten, oder seltsame und ungewöhnliche suchen Code. Class :: Inspektor versucht, eine einfache, benutzerfreundliche Oberfläche auf diese Informationen zur Verfügung zu stellen ...

Haben Sie einen Blick auf diese: Class :: Sniff

  

Die Schnittstelle ist eher ad-hoc zur Zeit und wird sich wahrscheinlich ändern. eine neue Instanz, ruft der Report-Methode ist die beste Option nach dem Erstellen. Anschließend können Sie es visuell prüfen für potenzielle Probleme suchen:

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

Dieses Modul versucht Programmierer finden ‚Code Smells‘ in dem objektorientierten Code. Wenn es etwas berichtet, bedeutet es nicht, dass der Code falsch ist. Es bedeutet nur, dass Sie Ihren Code ein wenig näher zu sehen sehen möchten, wenn Sie irgendwelche Probleme haben.

     

In der heutigen Zeit, gehen wir davon aus Perl-Standard am weitesten links, Tiefensuchauftrag. Wir können dies in Zukunft ändern (und es gibt eine Behelfslösung mit dem Pfad Verfahren. Mehr dazu später) ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top