Pregunta

¿Cuál es la mejor manera de descubrir programáticamente todas las subrutinas que tiene un módulo perl? Esto podría ser un módulo, una clase (no @EXPORT) o cualquier cosa intermedia.

Editar: todos los métodos a continuación parecen funcionar. Probablemente usaría el Class :: Sniff o Class :: Inspector en producción. Sin embargo, la respuesta de Leon está marcada como "aceptada", ya que responde a la pregunta tal como se plantea, aunque no se debe usar sin 'refs' estrictos. :-) Class :: Sniff puede ser una buena opción a medida que avanza; Parece que se ha pensado mucho en ello.

¿Fue útil?

Solución

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 desea filtrar las subrutinas importadas, puede hacerlo

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

ETA: si desea filtrar las subrutinas importadas, puede hacerlo

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

ETA: si desea filtrar las subrutinas importadas, puede hacerlo

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

ETA: si desea filtrar las subrutinas importadas, puede hacerlo

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

ETA: si desea filtrar las subrutinas importadas, puede hacerlo

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

ETA: si desea filtrar las subrutinas importadas, puede hacerlo

<*>

Otros consejos

Class :: Inspector :

  

Clase :: Inspector le permite obtener información sobre una clase cargada. La mayoría o toda esta información se puede encontrar de otras maneras, pero no siempre son muy amigables, y generalmente involucran un nivel relativamente alto de magia de Perl, o código de aspecto extraño e inusual. Class :: Inspector intenta proporcionar una interfaz más fácil y amigable para esta información ...

Echa un vistazo a esto: Class :: Sniff

  

La interfaz es bastante ad-hoc en este momento y es probable que cambie. Después de crear una nueva instancia, llamar al método de informe es su mejor opción. Luego puede examinarlo visualmente para buscar posibles problemas:

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

Este módulo intenta ayudar a los programadores a encontrar 'olores de código' en el código orientado a objetos. Si informa algo, no significa que su código sea incorrecto. Solo significa que es posible que desee ver su código un poco más de cerca para ver si tiene algún problema.

     

En este momento, asumimos el orden de búsqueda predeterminado de Perl, primero a la izquierda, primero a la izquierda. Podemos alterar esto en el futuro (y hay una solución alternativa con el método de rutas. Más sobre esto más adelante) ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top