Domanda

Qual è il modo migliore per scoprire programmaticamente tutte le subroutine di un modulo perl? Questo potrebbe essere un modulo, una classe (no @EXPORT) o qualsiasi altra via di mezzo.

Modifica: tutti i metodi seguenti sembrano funzionare. Probabilmente userei Class :: Sniff o Class :: Inspector in produzione. Tuttavia, la risposta di Leon è contrassegnata come "accettata" poiché risponde alla domanda come posta, anche se non deve essere usato nessun 'ref' rigoroso . :-) Classe :: Sniff può essere una buona scelta man mano che avanza; sembra che ci abbia pensato molto.

È stato utile?

Soluzione

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: se vuoi filtrare le subroutine importate, puoi farlo

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

ETA: se vuoi filtrare le subroutine importate, puoi farlo

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

ETA: se vuoi filtrare le subroutine importate, puoi farlo

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

ETA: se vuoi filtrare le subroutine importate, puoi farlo

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

ETA: se vuoi filtrare le subroutine importate, puoi farlo

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

ETA: se vuoi filtrare le subroutine importate, puoi farlo

<*>

Altri suggerimenti

Class :: Inspector :

  

Class :: Inspector ti consente di ottenere informazioni su una classe caricata. La maggior parte o tutte queste informazioni possono essere trovate in altri modi, ma non sono sempre molto amichevoli e di solito coinvolgono un livello relativamente alto di magia del Perl o codice dall'aspetto strano e insolito. Class :: Inspector tenta di fornire un'interfaccia più semplice e più amichevole a queste informazioni ...

Dai un'occhiata a questo: Class :: Sniff

  

Al momento l'interfaccia è piuttosto ad-hoc e probabilmente cambierà. Dopo aver creato una nuova istanza, chiamare il metodo di report è l'opzione migliore. Puoi quindi esaminarlo visivamente per cercare potenziali problemi:

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

Questo modulo tenta di aiutare i programmatori a trovare "odori di codice" nel codice orientato agli oggetti. Se segnala qualcosa, non significa che il tuo codice sia sbagliato. Significa solo che potresti voler esaminare il tuo codice un po 'più da vicino per vedere se hai qualche problema.

     

Al momento, supponiamo che l'ordine di ricerca di Perl sia il più a sinistra, il primo in profondità. Potremmo modificarlo in futuro (e c'è una soluzione al metodo dei percorsi. Maggiori informazioni su questo in seguito) ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top