Как я могу проверить, установлен ли модуль 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 -e 1
 $ 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"`;
 }'
Другие вопросы по тегам