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.

Foi útil?

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 :

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) ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top