Aparte de intentar
perldoc <module name>
individualmente para cualquier módulo CPAN que me guste o pasando por el sistema de archivos y mirando los directorios no tengo idea de qué módulos tenemos instalados.
¿Cuál es la forma más sencilla de obtener una gran lista de todos los módulos CPAN instalados? Desde la línea de comando o de otra manera.
cpan -l
útil en Windows.instmodsh
Respuestas:
Esto se responde en las preguntas frecuentes de Perl, la respuesta que se puede encontrar rápidamente con
perldoc -q installed
. En resumen, se trata de usarExtUtils::Installed
o usarFile::Find
variantes de ambos que se han tratado anteriormente en este hilo.También puede encontrar la entrada de preguntas frecuentes "¿Cómo encuentro qué módulos están instalados en mi sistema?" en perlfaq3. Puede ver una lista de todas las respuestas a las preguntas frecuentes si busca en perlfaq
fuente
ExtUtils::Installed
constructorskip_cwd
desde esa línea de comando?cpan -l
pero eso no funciona en RHEL6 y/usr/bin/cpan -l
arroja el errorUnknown option: l
.Editar: hay (un poco) más de información al respecto en las preguntas frecuentes de CPAN
fuente
perldoc -q installed
afirma que funcionará
cpan -l
, sin embargo, no me funciona. La otra opción:cpan -a
escupe una buena lista de paquetes instalados y tiene el agradable efecto secundario de escribirlos en un archivo.
fuente
cpan -l
funciona (o lo hace para mí con CPAN v2.05).cpan -a
es de hecho más bonito.Vale la pena señalar que perldoc perllocal solo informará sobre los módulos instalados a través de CPAN. Si alguien instala módulos manualmente, no los encontrará. Además, si tiene varias personas instalando módulos y perllocal.pod está bajo control de código fuente, la gente podría resolver los conflictos incorrectamente y corromper la lista (esto ha sucedido aquí en el trabajo, por ejemplo).
Lamentablemente, la solución parece ser recorrer @INC con File :: Find o algo similar. Sin embargo, eso no solo encuentra los módulos, también encuentra módulos relacionados en una distribución. Por ejemplo, informaría TAP :: Harness y TAP :: Parser además del nombre de distribución real de Test :: Harness (asumiendo que tiene la versión 3 o superior). Potencialmente, podría emparejarlos con nombres de distribución y descartar aquellos nombres que no coincidan, pero luego podría estar descartando módulos construidos e instalados localmente.
Creo que se supone que el trabajo de indexación de backpan de brian d foy tiene código para entregarlo en el archivo .pm e intentará inferir la distribución, pero incluso esto falla a veces porque lo que hay en un paquete no está necesariamente instalado (ver Devel :: Cover :: Inc por ejemplo).
fuente
$ for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort Class::Inspector * "VERSION: 1.28" Crypt::CBC * "VERSION: 2.33" Crypt::Rijndael * "VERSION: 1.11" Data::Dump * "VERSION: 1.22" DBD::Oracle * "VERSION: 1.68" DBI * "VERSION: 1.630" Digest::SHA * "VERSION: 5.92" ExtUtils::MakeMaker * "VERSION: 6.84" install * "VERSION: 6.84" IO::SessionData * "VERSION: 1.03" IO::Socket::SSL * "VERSION: 2.016" JSON * "VERSION: 2.90" MIME::Base64 * "VERSION: 3.14" MIME::Base64 * "VERSION: 3.14" Mozilla::CA * "VERSION: 20141217" Net::SSLeay * "VERSION: 1.68" parent * "VERSION: 0.228" REST::Client * "VERSION: 271" SOAP::Lite * "VERSION: 1.08" Task::Weaken * "VERSION: 1.04" Term::ReadKey * "VERSION: 2.31" Test::Manifest * "VERSION: 1.23" Test::Simple * "VERSION: 1.001002" Text::CSV_XS * "VERSION: 1.16" Try::Tiny * "VERSION: 0.22" XML::LibXML * "VERSION: 2.0108" XML::NamespaceSupport * "VERSION: 1.11" XML::SAX::Base * "VERSION: 1.08"
fuente
No documentation found for "perllocal".
Puede probar ExtUtils-Installed , pero eso solo se ve en
.packlist
s, por lo que puede perder módulos a los que las personas movieron cosas@INC
mano.Escribí App-Module-Lister para un amigo que quería hacer esto como un script CGI en una cuenta de alojamiento web que no fuera shell. Simplemente tome el archivo del módulo y cárguelo como un nombre de archivo que su servidor tratará como un script CGI. No tiene dependencias fuera de la biblioteca estándar. Úselo tal cual o robe el código.
Genera una lista de los módulos y sus versiones:
He querido agregar esto como una función a la
cpan
herramienta, así que también lo haré. [El tiempo pasa] Y ahora tengo un-l
interruptorcpan
. Tengo algunas otras cosas que hacer con él antes de hacer un lanzamiento, pero está en github . Si no quiere esperar por eso, puede probar el-a
interruptor para crear un paquete automático, aunque eso pone algo de Pod en la lista.Buena suerte;
fuente
Aquí un guión que haría el truco:
use ExtUtils::Installed; my $inst = ExtUtils::Installed->new(); my @modules = $inst->modules(); foreach $module (@modules){ print $module ." - ". $inst->version($module). "\n"; } =head1 ABOUT This scripts lists installed cpan modules using the ExtUtils modules =head1 FORMAT Prints each module in the following format <name> - <version> =cut
fuente
Perl - 5.10.1
módulos no se enumeran.Me gusta usar el comando CPAN 'r' para esto. Puede ingresar al shell CPAN con el estilo antiguo:
o, en la mayoría de los sistemas más nuevos, hay un comando 'cpan', por lo que este comando lo llevará al shell:
(Por lo general, debe usar 'sudo' para ejecutarlo como root, o usar 'su -' para convertirse en root antes de ejecutarlo, a menos que tenga cpan configurado para permitirle ejecutarlo como un usuario normal, pero instalarlo como root. Si no tiene root en esta máquina, aún puede usar el shell de CPAN para encontrar esta información, pero no podrá instalar módulos y es posible que deba realizar un poco de configuración la primera vez que ejecutarlo.)
Luego, una vez que esté en el shell cpan, puede usar el comando 'r' para informar todos los módulos instalados y sus versiones. Entonces, en el indicador "cpan>", escriba 'r'. Esto mostrará una lista de todos los módulos instalados y sus versiones. Utilizar '?' para obtener más ayuda.
fuente
sudo
aquí? Es completamente innecesario.Aquí hay una forma realmente peligrosa de hacerlo en * nix, obtendrá algunas cosas que realmente no le importan (es decir: advertencias :: registrarse, etc.), pero debería darle una lista de todos los archivos .pm a los que se puede acceder a través de perl.
for my $path (@INC) { my @list = `ls -R $path/**/*.pm`; for (@list) { s/$path\///g; s/\//::/g; s/\.pm$//g; print; } }
fuente
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'
fuente
*.pm
módulo. Es posible que vea muchos duplicados ...Puede obtener una lista de los módulos perl instalados en su sistema usando el
instmodsh
comando en su terminal. Le pedirá tres opciones para mejorar la salida que son:l - List all installed modules m <module> - Select a module q - Quit the program
fuente
En Linux / Unix utilizo este sencillo comando:
perl -e 'print qx/find $_ -name "*.pm"/ foreach ( @INC );'
Escanea todas las carpetas
@INC
y busca cualquier archivo * .pm.fuente
Prueba el siguiente comando
instmodsh
fuente
La respuesta se puede encontrar en la lista de preguntas frecuentes de Perl .
Debería echar un vistazo a la excelente documentación que viene con Perl
fuente
Prueba
man perllocal
operldoc perllocal
.fuente
Ayer mismo escribí un script en Perl para hacer exactamente esto. El script devuelve la lista de módulos perl instalados en @INC usando '::' como separador. Llame al script usando -
O
perl perlmod.pl <module name> #Case-insensitive(eg. perl perlmod.pl ftp)
A partir de ahora, el script omite el directorio actual ('.') Ya que estaba teniendo problemas con la recursión de enlaces suaves, pero puede incluirlo cambiando la función grep en la línea 17 de
grep { $_ !~ '^\.$' } @INC
para sólo,
El guión se puede encontrar aquí.
fuente
Aquí hay otra herramienta de línea de comandos para enumerar todos los archivos .pm instalados:
Encuentre módulos de Perl instalados que coincidan con una expresión regular
fuente
Para recorrer los árboles del directorio @INC sin usar un programa externo como ls (1), se podría usar el
File::Find::Rule
módulo, que tiene una bonita interfaz declarativa.Además, desea filtrar los duplicados en caso de que las versiones anteriores de Perl contengan los mismos módulos. El código para hacer esto se ve así:
#! /usr/bin/perl -l use strict; use warnings; use File::Find::Rule; my %seen; for my $path (@INC) { for my $file (File::Find::Rule->name('*.pm')->in($path)) { my $module = substr($file, length($path)+1); $module =~ s/.pm$//; $module =~ s{[\\/]}{::}g; print $module unless $seen{$module}++; } }
Al final de la ejecución, también tiene todos los nombres de sus módulos como claves en el% de hash visto. El código podría adaptarse para guardar el nombre de archivo canónico (dado en $ file) como el valor de la clave en lugar de un recuento de veces visto.
fuente
Lo siguiente funcionó para mí.
$ perldoc perllocal | grep Module $ perldoc perllocal | grep -E 'VERSION|Module'
fuente
Todos aquellos que no puedan instalar perldoc u otros módulos y quieran saber qué módulos están disponibles (CPAN o de otro tipo), lo siguiente funciona para Linux y Mingw32 / 64:
grep -RhIP '^package [A-Z][\w:]+;' `perl -e 'print join " ",@INC'` | sed 's/package //' | sort | uniq
Sí, es desordenado. Sí, probablemente informe más de lo que desea. Pero si lo canaliza a un archivo, puede verificar fácilmente, por ejemplo, qué interfaces dbm están presentes:
grep -RhIP '^package [A-Z][\w:]+;' `perl -e 'print join " ",@INC'` | sed 's/package //' | sort | uniq > modules-installed cat modules-installed | grep -i dbm AnyDBM_File; Memoize::AnyDBM_File; Memoize::NDBM_File; Memoize::SDBM_File; WWW::RobotRules::AnyDBM_File;
Por eso terminé en esta página (decepcionado)
(Me doy cuenta de que esto no responde exactamente a la pregunta del OP, pero lo estoy publicando para cualquiera que haya terminado aquí por la misma razón que yo. Ese es el problema con la pila ***, es casi imposible encontrar la pregunta que estás preguntando, incluso cuando existe, ¡pero stack *** es casi siempre el mayor éxito de Google!
fuente
el libro de recetas de Perl contiene varias iteraciones de un script "pmdesc" que hace lo que usted quiere. Busque en Google "Perl Cookbook pmdesc" y encontrará artículos en otros sitios de preguntas y respuestas , varios listados de códigos en la red, una discusión sobre la solución e incluso algunas mejoras .
fuente
Aquí hay un resumen de Perl que imprimirá una lista de módulos instalados:
perl -MExtUtils::Installed -MData::Dumper -e 'my ($inst) = ExtUtils::Installed->new(); print Dumper($inst->modules());'
Solo asegúrate de tener Data :: Dumper instalado.
fuente
Los usuarios de Windows simplemente realizan una búsqueda en el Explorador de Windows para encontrarlo.
fuente
Prueba "perldoc -l":
$ perldoc -l Log :: Dispatch /usr/local/share/perl/5.26.1/Log/Dispatch.pm
fuente
Aquí hay un guión de @ JamesThomasMoon1979 reescrito como una sola línea
perl -MExtUtils::Installed -e '$i=ExtUtils::Installed->new(); print "$_ ".$i->version($_)."\n" for $i->modules();'
fuente
A medida que ingresa su script Perl, tiene todos los módulos instalados como archivos .pm debajo de las carpetas en @INC, por lo que un pequeño script bash hará el trabajo por usted:
#!/bin/bash echo -e -n "Content-type: text/plain\n\n" inc=`perl -e '$, = "\n"; print @INC;'` for d in $inc do find $d -name '*.pm' done
fuente
find `perl -le'print for@INC'` -name '*.pm'
Para Linux, la forma más fácil de conseguirlo es,
dpkg -l | grep "perl"
fuente
Esto funciona para mi
perl -e 'print join("\n",@INC,"")'
fuente
Esto es lo que hago:
perl -M{cpan_module}
si no recibe ningún error, es muy probable que el módulo esté instalado.
fuente