Каков наилучший способ обнаружить все подпрограммы модуля Perl?
Какой лучший способ программно обнаружить все подпрограммы, которые имеет модуль perl? Это может быть модуль, класс (нет @EXPORT) или что-то промежуточное.
Изменить: все приведенные ниже методы выглядят так, как будто они будут работать. Я бы, вероятно, использовал Class:: Sniff или Class:: Inspector в производстве. Однако ответ Леона помечен как "принятый", так как он отвечает на вопрос как поставленный, хотя no strict 'refs'
должен использоваться.:-) Класс:: Sniff может быть хорошим выбором по мере его продвижения; это похоже на то, что в него вошло много размышлений.
Ответы
Ответ 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 по умолчанию имеет самый левый порядок поиска по глубине. Мы можем изменить это в будущем (и там обход с методом путей. Подробнее об этом позже)...