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

Как проверить, установлен ли модуль Perl в моей системе из командной строки?

Я попытался проверить, установлен ли в моей системе XML:: Simple.

perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'

Вышеупомянутый однострочный файл был использован для перечисления всех модулей, установленных в моей системе. Однако он не перечисляет XML-модули.

Однако выполнение выполняется отлично.

perl -e "use XML::Simple "

В чем может быть проблема?

4b9b3361

Ответ 1

Вы можете проверить путь установки модуля:

perldoc -l XML::Simple

Проблема с вашим однострочным шрифтом заключается в том, что он не рекурсивно пересекает каталоги/подкаталоги. Следовательно, вы получаете только прагматические имена модулей в качестве вывода.

Ответ 2

Быстрая и грязная:

$ perl -MXML::Simple -e 1

Ответ 3

$ perl -MXML::Simple -le 'print $INC{"XML/Simple.pm"}'

Из perlvar запись %INC:

  • % INC

Хэш %INC содержит записи для каждого имени файла, включенного с помощью операторов do, require или use. Ключ - это имя файла, которое вы указали (с именами модулей, преобразованными в имена путей), и значение - это местоположение найденного файла. Оператор require использует этот хэш для определения того, был ли данный файл уже включен.

Если файл был загружен с помощью крючка (например, ссылка подпрограммы, см. require для описания этих крючков), этот крючок по умолчанию вставлен в %INC вместо имени файла. Обратите внимание, однако, что крючок, возможно, сам установил запись% INC, чтобы предоставить более подробную информацию.

Ответ 4

То, что вы делаете, не переписывается в каталоги. Он перечисляет только модули в корневом каталоге каталога @INC.

Модуль XML::Simple будет находиться в одном из путей @INC под XML/Simple.pm.

Что он сказал выше, чтобы найти определенные модули.

CPAN объясняет, как найти все модули здесь, см. Как найти установленные модули.

Ответ 5

Например, чтобы проверить, установлен ли модуль DBI или нет, используйте

perl -e 'use DBI;'

Вы увидите ошибку, если она не установлена. (от http://www.linuxask.com)

Ответ 6

Если вы хотите быстро проверить, установлен ли модуль (по крайней мере, в системах Unix, Bash в качестве оболочки), добавьте это в ваш .bashrc файл:

alias modver="perl -e\"eval qq{use \\\$ARGV[0];\\\\\\\$v=\\\\\\\$\\\${ARGV[0]}::VERSION;};\ print\\\[email protected]?qq{No module found\\n}:\\\$v?qq{Version \\\$v\\n}:qq{Found.\\n};\"\$1"

Затем вы можете:

=> modver XML::Simple
No module found

=> modver DBI
Version 1.607

Ответ 7

while (< @INC > )

Это объединяет пути в @INC вместе в строке, разделенные пробелами, а затем вызывает glob() в строке, которая затем выполняет итерацию через разделенные пробелом компоненты (если нет метасимволов с файловым глобализацией.)

Это не работает так хорошо, если в @INC есть пути, содержащие пробелы, \, [], {}, *,? или ~, и, похоже, нет причин избегать безопасной альтернативы:

for (@INC)

Ответ 8

Если вы используете ActivePerl под Windows:

  • C:\>ppm query *, чтобы получить список всех установленных модулей

  • C:\>ppm query XML-Simple, чтобы проверить, установлен ли XML::Simple

Ответ 9

Я считаю, что ваше решение будет выглядеть только в корне каждого пути каталога, содержащегося в массиве @INC. Вам нужно что-то рекурсивное, например:

 perl -e 'foreach (@INC) {
    print `find $_ -type f -name "*.pm"`;
 }'

Ответ 10

Решение Bravo для @user80168 (я все еще считал \!), но чтобы избежать всех экранов, связанных с псевдонимами и оболочками:

%~/ cat ~/bin/perlmod
perl -le'eval qq{require $ARGV[0]; } 
    ? print ( "Found $ARGV[0] Version: ", eval "$ARGV[0]->VERSION" ) 
    : print "Not installed" ' $1

работает достаточно хорошо.

Здесь может быть самый простой и самый "современный" подход, используя Module::Runtime:

perl -MModule::Runtime=use_module -E '
     say "$ARGV[0] ", use_module($ARGV[0])->VERSION' DBI

Это даст полезную ошибку, если модуль не установлен.

Использование -MModule::Runtime требует его установки (это не основной модуль).