Как проверить, установлен ли модуль Perl в моей системе из командной строки?
Я попытался проверить, установлен ли в моей системе XML:: Simple.
perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'
Вышеупомянутый однострочный файл был использован для перечисления всех модулей, установленных в моей системе. Однако он не перечисляет XML-модули.
Однако выполнение выполняется отлично.
perl -e "use XML::Simple "
В чем может быть проблема?
Ответы
Ответ 1
Вы можете проверить путь установки модуля:
perldoc -l XML::Simple
Проблема с вашим однострочным шрифтом заключается в том, что он не рекурсивно пересекает каталоги/подкаталоги. Следовательно, вы получаете только прагматические имена модулей в качестве вывода.
Ответ 2
Быстрая и грязная:
$ perl -MXML::Simple -e 1
Ответ 3
$ perl -MXML::Simple -le 'print $INC{"XML/Simple.pm"}'
Из perlvar запись %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
требует его установки (это не основной модуль).