subrutinas - funciones en perl
¿Cuál es la mejor manera de descubrir todas las subrutinas que tiene un módulo Perl? (3)
Eche 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 ''códigos olores'' en el código orientado a objetos. Si informa algo, no significa que su código sea incorrecto. Simplemente 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, suponemos que la orden de búsqueda predeterminada de Perl por la izquierda es la primera en profundidad. Podemos modificar esto en el futuro (y hay una solución alternativa con el método de rutas. Más sobre esto más adelante) ...
¿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 elemento intermedio.
Editar: Todos los métodos a continuación parecen que funcionarán. 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 strict ''refs''
se deben usar no strict ''refs''
. :-) Clase :: Sniff puede ser una buena opción a medida que progresa; parece que se ha pensado mucho en ello.
Class :: Inspector le permite obtener información sobre una clase cargada. La mayor parte o la totalidad de esta información se puede encontrar de otras maneras, pero no siempre son muy amigables, y generalmente involucran un nivel relativamente alto de magia Perl, o un código extraño e inusual. Class :: Inspector intenta proporcionar una interfaz más fácil y amigable a esta información ...
sub list_module {
my $module = shift;
no strict ''refs'';
return grep { defined &{"$module/::$_"} } keys %{"$module/::"}
}
ETA: si quieres filtrar las subrutinas importadas, puedes hacer esto
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/::"}
}