2009-06-24 18 views
45

Ho provato a verificare se XML :: Simple è installato nel mio sistema oppure no.Come posso verificare se un modulo Perl è installato sul mio sistema dalla riga di comando?

perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }' 

Il precedente liner è stato utilizzato 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?

+0

@Sinan: hai cambiato la domanda un po 'troppo. Penso che la domanda iniziale fosse come scoprire dove è installato un modulo. Ora è se un modulo è installato. – innaM

+0

Non ne ho idea. Ma considerando la domanda attuale, la tua risposta è praticamente la migliore finora. Forse i Chells possono illuminarci. – innaM

+1

@Sinan: perché sei tornato dal modulo perl ai moduli perl quando quest'ultimo è stato appena usato? –

risposta

74

È possibile verificare la presenza di percorso di installazione di un modulo da:

perldoc -l XML::Simple 

Il problema con il vostro one-liner è che, non è ricorsivo attraversando directory/sottodirectory. Quindi, si ottengono solo i nomi dei moduli pragmatici come output.

+1

Ovviamente, ciò funzionerà solo se il modulo che si sta cercando contiene POD. – innaM

+1

@Manni: dovrebbe funzionare con la maggior parte dei moduli (da CPAN) poiché tutti sono documentati. –

+1

Alcuni di essi sono così ben documentati da avere i loro documenti nei propri file .pod. È un bel trucco che funziona la maggior parte del tempo con quel piccolo trucco. – innaM

8

Quello che stai facendo non ricorre nelle directory. Elenca solo i moduli nella directory principale della directory @INC.

Il modulo XML::Simple vivrà in uno dei percorsi @INC sotto XML/Simple.pm.

Cosa ha detto sopra per trovare moduli specifici.

CPAN spiega come trovare tutti i moduli qui, vedere How to find installed modules.

+1

+1 per spiegare il problema con il codice dell'OP. –

17
$ perl -MXML::Simple -le 'print $INC{"XML/Simple.pm"}'

Dal perlvar ingresso sul %INC:

  • % INC

L'hash %INC contiene le voci per ogni nome di file incluso con il do, require o use operatori . La chiave è il nome file specificato (con i nomi dei moduli convertiti in nomi di percorso) e il valore è la posizione del file trovato. L'operatore require utilizza questo hash per determinare se un determinato file è già stato incluso.

Se il file è stato caricato tramite un gancio (ad esempio un riferimento subroutine, vedere require per una descrizione di questi ganci), l'amo predefinita inserita %INC al posto di un nome di file. Si noti, tuttavia, che il gancio potrebbe aver impostato la voce% INC da sola per fornire alcune informazioni più specifiche.

+0

http://theunixshell.blogspot.in/2012/12/check-for-installed-modules-in-perl.html – Vijay

3

mentre (< @INC>)

Questo unisce i percorsi in @INC insieme in una stringa, separate da spazi, quindi chiama glob() sulla stringa, che poi scorre i componenti separati dallo spazio (a meno che non ci siano meta-caratteri che nascondono il file.)

Questo non funziona così bene se ci sono percorsi in @INC che contengono spazi, \, [], {}, *,?O ~, e sembra che ci sia alcun motivo per evitare l'alternativa sicura:

for (@INC) 
6

Se si desidera controllare velocemente se è installato un modulo (almeno su sistemi Unix, con Bash come shell), aggiungere questo al vostro .bashrc del file:

alias modver="perl -e\"eval qq{use \\\$ARGV[0];\\\\\\\$v=\\\\\\\$\\\${ARGV[0]}::VERSION;};\ print\\\[email protected]?qq{No module found\\n}:\\\$v?qq{Version \\\$v\\n}:qq{Found.\\n};\"\$1" 

Quindi è possibile:

=> modver XML::Simple 
No module found 

=> modver DBI 
Version 1.607 
+0

Amo questo. Grazie. – Anthony

31

veloce e sporco:

$ perl -MXML::Simple -e 1 
+2

Sebbene, se si desidera la versione, molte persone dicono "perl -MModule \ 999". – jrockway

+0

Per l'editor anonimo: il modo corretto sarebbe 'perl -MDigest :: SHA -e 1' piuttosto che' perl -Digest :: SHA -e 1'. –

+1

Io lo uso sempre, anche se di solito faccio una stampa "-e" (\ "ho capito \ n \") "' – Lucas

3

Se si sta eseguendo sotto Windows:

  • C:\>ppm query * per ottenere un elenco di tutti i moduli installati

  • C:\>ppm query XML-Simple per verificare se è installato XML::Simple

9

Per Ad esempio, per verificare se il modulo DBI è installato o meno, utilizzare

perl -e 'use DBI;' 

Vedrete errore se non installato. (da http://www.linuxask.com)

0

Credo che la soluzione cercherà solo nella radice di ogni percorso di directory contenuto nell'array @INC. Hai bisogno di qualcosa ricorsivo, come:

perl -e 'foreach (@INC) { 
    print `find $_ -type f -name "*.pm"`; 
}' 
0

Bravo per @ di user80168 soluzione (sto ancora contando \ 's!), Ma per evitare tutti i escape coinvolto con alias e conchiglie:

%~/ cat ~/bin/perlmod 
perl -le'eval qq{require $ARGV[0]; } 
    ? print ("Found $ARGV[0] Version: ", eval "$ARGV[0]->VERSION") 
    : print "Not installed" ' $1 

opere abbastanza bene.

Qui potrebbe essere l'approccio più semplice e la più "moderna", usando Module::Runtime:

perl -MModule::Runtime=use_module -E ' 
    say "$ARGV[0] ", use_module($ARGV[0])->VERSION' DBI 

questo darà un errore di utile se il modulo non è installato.

L'utilizzo di -MModule::Runtime richiede l'installazione (non è un modulo principale).

Problemi correlati