Подтвердить что ты не робот

Каков наилучший способ обнаружить все подпрограммы модуля Perl?

Какой лучший способ программно обнаружить все подпрограммы, которые имеет модуль perl? Это может быть модуль, класс (нет @EXPORT) или что-то промежуточное.

Изменить: все приведенные ниже методы выглядят так, как будто они будут работать. Я бы, вероятно, использовал Class:: Sniff или Class:: Inspector в производстве. Однако ответ Леона помечен как "принятый", так как он отвечает на вопрос как поставленный, хотя no strict 'refs' должен использоваться.:-) Класс:: Sniff может быть хорошим выбором по мере его продвижения; это похоже на то, что в него вошло много размышлений.

4b9b3361

Ответ 1

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

ETA: если вы хотите отфильтровать импортированные подпрограммы, вы можете сделать это

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

Ответ 2

Class::Inspector:

Класс:: Инспектор позволяет получить информацию о загруженном классе. Большинство или всю эту информацию можно найти другими способами, но они не всегда очень дружелюбны и обычно включают относительно высокий уровень волшебства Perl, или странный и необычно выглядящий код. Class:: Inspector пытается обеспечить более удобный и удобный интерфейс для этой информации...

Ответ 3

Посмотрите на это: Class::Sniff

В настоящий момент интерфейс довольно ad-hoc и, вероятно, изменится. После создания нового экземпляра вызов метода отчета является наилучшим вариантом. Затем вы можете визуально изучить его для поиска потенциальных проблем:

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

Этот модуль пытается помочь программистам найти "запахи кода" в объектно-ориентированном коде. Если он что-то сообщает, это не значит, что ваш код неправильный. Это просто означает, что вы можете немного взглянуть на свой код, чтобы узнать, есть ли у вас какие-либо проблемы.

В настоящее время мы предполагаем, что Perl по умолчанию имеет самый левый порядок поиска по глубине. Мы можем изменить это в будущем (и там обход с методом путей. Подробнее об этом позже)...