Как я могу проверить, установлен ли модуль Perl в моей системе из командной строки?
Я попытался проверить, установлен ли XML::Simple в моей системе или нет.
perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'
Вышеуказанная однострочная строка использовалась для перечисления всех модулей, установленных в моей системе. Однако это не список XML-модулей.
Тем не менее, следующее выполняется нормально.
perl -e "use XML::Simple "
В чем может быть проблема?
11 ответов
Вы можете проверить путь установки модуля:
perldoc -l XML::Simple
Проблема с одной строкой заключается в том, что она не рекурсивно пересекает каталоги / подкаталоги. Следовательно, вы получаете только прагматичные имена модулей в качестве вывода.
$ perl -MXML::Simple -le 'print $INC{"XML/Simple.pm"}'
Из записи Perlvar на %INC
:
- %INC
Хеш
%INC
содержит записи для каждого имени файла, включенного черезdo
,require
, или жеuse
операторы. Ключ - это имя файла, которое вы указали (имена модулей преобразуются в пути), а значение - местоположение найденного файла.require
Оператор использует этот хэш, чтобы определить, был ли конкретный файл уже включен.Если файл был загружен через ловушку (например, ссылку на подпрограмму, см. Require для описания этих ловушек), эта ловушка по умолчанию вставляется в
%INC
вместо имени файла. Обратите внимание, однако, что ловушка, возможно, сама установила запись%INC, чтобы предоставить некоторую более конкретную информацию.
Например, чтобы проверить, установлен модуль DBI или нет, используйте
perl -e 'use DBI;'
Вы увидите ошибку, если не установлена. (с http://www.linuxask.com/)
Если вы хотите быстро проверить, установлен ли модуль (по крайней мере, в системах Unix с Bash в качестве оболочки), добавьте это в ваш файл.bashrc:
alias modver="perl -e\"eval qq{use \\\$ARGV[0];\\\\\\\$v=\\\\\\\$\\\${ARGV[0]}::VERSION;};\ print\\\$@?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
То, что вы делаете там, не повторяется в каталогах. Это только перечисление модулей в корневом каталоге @INC
каталог.
Модуль XML::Simple
будет жить в одном из @INC
пути под XML/Simple.pm
,
То, что он сказал выше, чтобы найти конкретные модули.
CPAN
объясняет, как найти все модули здесь, см. Как найти установленные модули.
пока (<@INC>)
Это объединяет пути в @INC вместе в строку, разделенную пробелами, затем вызывает glob() для строки, которая затем перебирает компоненты, разделенные пробелами (если нет метасимволов с глобальными файлами).
Это не очень хорошо работает, если в @INC есть пути, содержащие пробелы, \, [], {}, *,? Или ~, и, кажется, нет причин избегать безопасной альтернативы:
for (@INC)
Если вы используете ActivePerl под Windows:
C:\>ppm query *
получить список всех установленных модулейC:\>ppm query XML-Simple
проверить, еслиXML::Simple
установлено
Браво для решения @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
требует его установки (это не основной модуль).
Вы можете использоватьcpan -D module
. Глянь сюда
В твоем случаеcpan -D XML::Simple
.
Он сообщит вам, где установлен модуль, а также обновлен ли он.
Я считаю, что ваше решение будет искать только в корне каждого пути к каталогу, содержащегося в массиве @INC. Вам нужно что-то рекурсивное, например:
perl -e 'foreach (@INC) {
print `find $_ -type f -name "*.pm"`;
}'