Ответ 1
Просто для того, чтобы быть понятным - вы не можете получить общий список модулей, зависящих только от анализа кода. Например. если ваши приложения eval { require $module; $module->import() }
, где $module
передается через командную строку, тогда это ТОЛЬКО можно обнаружить, фактически выполнив конкретную версию командной строки со всеми значениями модуля.
Если вы хотите это сделать, вы можете определить каждый модуль, используемый комбинацией прогонов через:
-
Devel::Cover
. В отчетах о покрытии будет указано 100% используемых модулей. Но вы не получаете версию #s. -
Распечатайте
%INC
в каждую возможную точку выхода в коде, как сказал ответ slu. Вероятно, это должно быть сделано в блокеEND{}
, а также в обработчике__DIE__
, чтобы охватить все возможные точки выхода, и даже тогда это может быть не полностью 100% покрытие в общем случае, если где-то внутри программы ваш обработчик__DIE__
перезаписывается. -
Devel::Modlist
(также упомянутый slu-ответом) - недостаток по сравнению сDevel::Cover
заключается в том, что он, похоже, не может объединить базу данных в несколько прогонов прогона, например,Devel::Cover
. С положительной стороны, он специально создан, поэтому имеет много очень полезных опций (пути CPAN, версии). -
Обратите внимание, что другой модуль (
Module::ScanDeps
) НЕ позволяет вам выполнять анализ времени выполнения на основе произвольных аргументов командной строки (например, на первый взгляд кажется, что вы разрешаете выполнять программу без аргументы), и если это правда, уступает всем выше перечисленным 3 методам для любого кода, который может загружать модули динамически.