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

StackOverflow https://stackoverflow.com/questions/607282

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

Класс::Инспектор:

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

Взгляните на это:Класс::Нюхать

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top