peru pagina oficial manager library perl cpan

perl - pagina - ¿Cómo obtengo una lista de módulos de CPAN instalados?



perl package manager (26)

Al ingresar su secuencia de comandos de 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

Aparte de intentar

perldoc <module name>

individualmente para cualquier módulo de CPAN que me apetezca o pase por el sistema de archivos y mirando los directorios, no tengo idea de qué módulos hemos instalado.

¿Cuál es la forma más fácil de obtener una gran lista de todos los módulos de CPAN instalados? Desde la línea de comando o de lo contrario.



Aquí hay un trazador de líneas 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 instalado Data :: Dumper.


Aquí hay una manera realmente chistosa de hacerlo en * nix, obtendrá algunas cosas que realmente no le importan (es decir, advertencias :: registro, etc.), pero debería darle una lista de cada archivo .pm al 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; } }


Aquí un script 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


Escribí un script de perl ayer para hacer exactamente esto. El script devuelve la lista de módulos perl instalados en @INC utilizando el ''::'' como separador. Llamar al script usando -

perl perlmod.pl

O

perl perlmod.pl <module name> #Case-insensitive(eg. perl perlmod.pl ftp)

A partir de ahora, el guión se salta el directorio actual (''.'') Ya que estaba teniendo problemas con la recurrencia de soft-links, pero puede incluirlo cambiando la función grep en la línea 17 de

grep { $_ !~ ''^/.$'' } @INC

para sólo,

@INC

El script se puede encontrar here.


Esto es lo que hago: perl -M{cpan_module}
Si no recibe ningún error, existe una buena posibilidad de que el módulo esté instalado.


Esto funciona para mí

perl -e ''print join("/n",@INC,"")''


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 usar ExtUtils::Installed o usar File::Find , variantes de los cuales se han cubierto anteriormente en este hilo.

También puede encontrar la entrada de preguntas frecuentes "¿Cómo puedo encontrar qué módulos están instalados en mi sistema?" en perlfaq3. Puede ver una lista de todas las respuestas a las preguntas frecuentes al buscar en perlfaq



Lo siguiente funcionó para mí.

$ perldoc perllocal | grep Module $ perldoc perllocal | grep -E ''VERSION|Module''


Me gusta usar el comando CPAN ''r'' para esto. Puede acceder al shell CPAN con el estilo anterior:

sudo perl -MCPAN -e shell

o, en la mayoría de los sistemas más nuevos, hay un comando ''cpan'', por lo que este comando te llevará al shell:

sudo cpan

(Por lo general, debe usar ''sudo'' para ejecutarlo como root, o usar ''su -'' para convertirse en root antes de ejecutarlo, a menos que tenga configurado el cpan para que pueda ejecutarlo como un usuario normal, pero instálelo como root. Si no tiene root en esta máquina, puede seguir usando el shell CPAN para averiguar 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 reportar todos los módulos instalados y sus versiones. Por lo tanto, en el mensaje "cpan>", escriba ''r''. Esto mostrará una lista de todos los módulos instalados y sus versiones. Utilizar ''?'' para obtener un poco más de ayuda.


Para Linux, la manera más fácil de obtener es

dpkg -l | grep "perl"


Para recorrer los árboles del directorio @INC sin usar un programa externo como ls (1), se podría usar el File::Find::Rule , que tiene una buena 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 los módulos como claves en el% 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 conteo de veces visto.


Prueba el siguiente comando

instmodsh


Pruebe man perllocal o perldoc perllocal .


Puede obtener una lista de los módulos Perl instalados en su sistema mediante el uso del comando instmodsh 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


Puede probar ExtUtils-Installed , pero eso solo se ve en .packlist s, por lo que puede perder módulos que las personas movieron cosas en @INC a mano.

Escribí App-Module-Lister para un amigo que quería hacer esto como un script CGI en una cuenta de alojamiento web sin 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.

Muestra una lista de los módulos y sus versiones:

Tie::Cycle 1.15 Tie::IxHash 1.21 Tie::Toggle 1.07 Tie::ToObject 0.03 Time::CTime 99.062201 Time::DaysInMonth 99.1117 Time::Epoch 0.02 Time::Fuzzy 0.34 Time::JulianDay 2003.1125 Time::ParseDate 2006.0814 Time::Timezone 2006.0814

He tenido la intención de agregar esto como una característica de la herramienta cpan , así que también lo haré. [El tiempo pasa] Y ahora tengo un interruptor -l en cpan . Tengo algunas otras cosas que ver con esto antes de lanzar, pero está en github . Si no quieres esperar, puedes probar el interruptor -a para crear una autobundle, aunque eso pone un Pod alrededor de la lista.

Buena suerte;


Use perldoc -q instalado para obtener más información o simplemente escriba

perldoc <Module::Name>


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 el perllocal.pod está bajo control de fuente, las personas podrían resolver los conflictos de manera incorrecta y corromper la lista (esto ha sucedido aquí en el trabajo, por ejemplo).

Lamentablemente, la solución parece estar caminando a través de @INC con File :: Find o algo similar. Sin embargo, eso no solo busca los módulos, también encuentra módulos relacionados en una distribución. Por ejemplo, reportaría TAP :: Harness y TAP :: Parser además del nombre real de distribución de Test :: Harness (suponiendo que tiene la versión 3 o superior). Podría combinarlos con nombres de distribución y descartar aquellos nombres que no coinciden, pero entonces podría estar descartando módulos localmente construidos e instalados.

Creo que se supone que el trabajo de indexación de backpen de Brian tiene un código para entregarlo en el archivo .pm e intentará inferir la distribución, pero incluso esto falla a veces porque lo que está en un paquete no está necesariamente instalado (ver Devel :: Portada :: Inc por ejemplo).



perldoc -q installed

afirma que cpan -l hará el truco, sin embargo, no funciona para mí. La otra opción:

cpan -a

escupió una buena lista de paquetes instalados y tiene el bonito efecto secundario de escribirlos en un archivo.


$ 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"


cd /the/lib/dir/of/your/perl/installation perldoc $(find . -name perllocal.pod)

Los usuarios de Windows simplemente hacen una búsqueda de Windows Explorer para encontrarlo.


perl -MFile::Find=find -MFile::Spec::Functions -Tlwe ''find { wanted => sub { print canonpath $_ if //.pm/z/ }, no_chdir => 1 }, @INC''