Come posso verificare se un modulo Perl è installato sul mio sistema dalla riga di comando?
-
22-07-2019 - |
Domanda
Ho provato a verificare se XML :: Simple è installato nel mio sistema o meno.
perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'
Il precedente one-liner è stato usato per elencare tutti i moduli installati nel mio sistema. Tuttavia, non elenca i moduli XML.
Tuttavia, quanto segue viene eseguito correttamente.
perl -e "use XML::Simple "
Quale potrebbe essere il problema?
Soluzione
È possibile verificare il percorso di installazione di un modulo tramite:
perldoc -l XML::Simple
Il problema con il tuo one-liner è che non attraversa ricorsivamente directory / sottodirectory. Quindi, ottieni solo nomi di moduli pragmatici come output.
Altri suggerimenti
Veloce e sporco:
$ perl -MXML::Simple -e 1
$ perl -MXML::Simple -le 'print $INC{"XML/Simple.pm"}'
- % INC
L'hash
do
contiene voci per ciascun nome file incluso tramite gli operatorirequire
,use
o <=>. La chiave è il nome file specificato (con i nomi dei moduli convertiti in nomi percorsi) e il valore è la posizione del file trovato. L'operatore <=> utilizza questo hash per determinare se un determinato file è già stato incluso.Se il file è stato caricato tramite un hook (ad esempio un riferimento alla subroutine, vedere richiedi per una descrizione di questi hook), questo hook è di default inserito in <=> al posto di un nome file. Si noti, tuttavia, che l'hook potrebbe aver impostato la voce% INC da solo per fornire alcune informazioni più specifiche.
Ad esempio, per verificare se il modulo DBI è installato o meno, utilizzare
perl -e 'use DBI;'
Vedrai un errore se non installato. (da http://www.linuxask.com )
Quello che stai facendo non è ricorrere in directory. Elenca solo i moduli nella directory principale della @INC
directory.
Il modulo XML::Simple
vivrà in uno dei XML/Simple.pm
percorsi in CPAN
.
Quello che ha detto sopra per trovare moduli specifici.
<=> spiega come trovare tutti i moduli qui, vedi Come trovare moduli installati .
Se vuoi verificare rapidamente se un modulo è installato (almeno sui sistemi Unix, con Bash come shell), aggiungi questo al tuo file .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"
Quindi puoi:
=> modver XML::Simple
No module found
=> modver DBI
Version 1.607
while (< @INC >)
Questo unisce i percorsi in @INC in una stringa, separati da spazi, quindi chiama glob () sulla stringa, che quindi scorre attraverso i componenti separati da spazio (a meno che non ci siano meta-caratteri che alterano i file.)
Questo non funziona così bene se in @INC sono presenti percorsi contenenti spazi, \, [], {}, *,? o ~, e non sembra esserci alcun motivo per evitare l'alternativa sicura:
for (@INC)
Se stai eseguendo ActivePerl su Windows:
-
C:\>ppm query *
per ottenere un elenco di tutti i moduli installati -
C:\>ppm query XML-Simple
per verificare seXML::Simple
è installato
Credo che la tua soluzione cercherà solo nella radice di ogni percorso di directory contenuto nell'array @INC. Hai bisogno di qualcosa di ricorsivo, come:
perl -e 'foreach (@INC) {
print `find $_ -type f -name "*.pm"`;
}'
Bravo per la soluzione di @ user80168 (sto ancora contando \
di!) ma per evitare tutte le fughe coinvolte con alias e shell:
%~/ cat ~/bin/perlmod
perl -le'eval qq{require $ARGV[0]; }
? print ( "Found $ARGV[0] Version: ", eval "$ARGV[0]->VERSION" )
: print "Not installed" ' $1
funziona abbastanza bene.
Qui potrebbe essere il più semplice e il più " moderno " approccio, utilizzando Module::Runtime
:
perl -MModule::Runtime=use_module -E '
say "$ARGV[0] ", use_module($ARGV[0])->VERSION' DBI
Questo darà un utile errore se il modulo non è installato.
L'utilizzo di -MModule::Runtime
richiede l'installazione (non è un modulo principale).