2009-03-03 17 views
24

Qual è il modo migliore per scoprire in modo programmatico tutte le subroutine di un modulo perl? Questo potrebbe essere un modulo, una classe (no @EXPORT) o qualcosa di intermedio.Qual è il modo migliore per scoprire tutte le subroutine di un modulo Perl?

Modifica: tutti i metodi riportati di seguito sembrano funzionare. Probabilmente userò la classe :: Sniff o Class :: Inspector in produzione. Tuttavia, la risposta di Leon è contrassegnata come "accettata" poiché risponde alla domanda come posta, anche se deve essere utilizzato no strict 'refs'. :-) Class :: Sniff potrebbe essere una buona scelta mentre progredisce; sembra che ci sia passato un sacco di riflessioni.

risposta

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

ETA: se si desidera filtrare subroutine importati, si può fare questo

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\::"} 
} 
+1

Questo elencherà anche le subroutine che il modulo ha importato da altri moduli. – innaM

+0

Sarebbe problematico. –

+0

Ripensandoci, potrebbe anche essere importante, a seconda dell'applicazione. –

9

Date un'occhiata a questo: Class::Sniff

L'interfaccia è piuttosto ad-hoc al momento ed è probabile che cambi. Dopo aver creato una nuova istanza, chiamare il metodo del rapporto è la scelta migliore. È quindi possibile esaminare visivamente che per cercare potenziali problemi:

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

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

Al momento attuale, si presuppone che l'ordine di ricerca predefinito di Perl sia il più a sinistra, sia la profondità. Si possono modificare questo in futuro (e c'è un work-in giro con il metodo percorsi più su questo più tardi.) ...

+0

Sembra interessante, ma abbastanza nuovo. Sarei esitante a usarlo in un ambiente di produzione. –

+2

Quali motivi potresti avere per ottenere un elenco di metodi in un ambiente di produzione? – innaM

+1

Sono interessato alla prototipazione di uno strumento Test :: Class like. Sviluppare prototipi su altri codici non testati può portare grossi grattacapi. :) –

12

Class::Inspector:

Class :: Inspector 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 implicano un livello relativamente alto di magia Perl o un codice strano e dall'aspetto insolito. Class :: Inspector tenta di fornire un'interfaccia più facile e più amichevole a questa informazione ...

+0

Molto interessante, darò un'occhiata a questo. –

+0

Per me, questa risposta era migliore di quella di Leon, dal momento che avevo bisogno di tutti i metodi oggetto (tutto nella catena ereditaria). –

+0

Usare Class :: Inspector dal debugger perl è estremamente utile, grazie. – muriloq

Problemi correlati