Qual é a melhor maneira de descobrir todas as sub-rotinas de um módulo Perl tem?
-
03-07-2019 - |
Pergunta
Qual é a melhor maneira de programaticamente descobrir todos os sub-rotinas de um módulo Perl tem? Este poderia ser um módulo, uma classe (sem @EXPORT), ou qualquer coisa in-between.
Edit: Todos os métodos abaixo olhar como eles vão trabalhar. Eu provavelmente usar o Class :: Sniff ou Classe :: Inspector na produção. No entanto, a resposta de Leon é marcado como 'aceita', uma vez que responde à pergunta tal como colocada, embora no strict 'refs'
tem que ser usado. :-) Class :: Sniff pode ser uma boa escolha, pois progride; parece que um monte de pensamento tem ido para ele.
Solução
sub list_module {
my $module = shift;
no strict 'refs';
return grep { defined &{"$module\::$_"} } keys %{"$module\::"}
}
ETA: se você quiser filtrar sub-rotinas importados, você pode fazer isso
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\::"}
}
Outras dicas
Class Inspector :: permite-lhe obter informações sobre uma classe carregada. A maioria ou todas essas informações podem ser encontrados em outras maneiras, mas eles não são sempre muito amigável, e geralmente envolvem um nível relativamente elevado de Perl magia, ou código de aparência estranha e incomum. Class :: Inspector tentativas de fornecer uma interface mais fácil, mais amigável para esta informação ...
Tenha um olhar para isto: Class :: Sniff
A interface é bastante ad-hoc no momento e é provável que a mudança. Depois de criar uma nova instância, chamando o método relatório é a sua melhor opção. Você pode então examinar visualmente a procurar potenciais problemas:
my $sniff = Class::Sniff->new({class => 'Some::Class'}); print $sniff->report;
Este módulo tenta programadores ajudar a encontrar 'código de cheiros' no código orientado a objetos. Se ele relata alguma coisa, isso não significa que seu código está errado. Significa apenas que você pode querer olhar para o seu código um pouco mais de perto para ver se você tiver quaisquer problemas.
No momento, assumimos padrão do Perl mais à esquerda, ordem de pesquisa em profundidade. Podemos alterar isso no futuro (e não há uma forma de contornar com o método caminhos. Mais sobre isso mais tarde) ...