2009-06-24 12 views
45

Ich habe versucht zu überprüfen, ob XML :: Simple in meinem System installiert ist oder nicht.Wie kann ich überprüfen, ob ein Perl-Modul von der Befehlszeile auf meinem System installiert ist?

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

Die oben Einzeiler wurde zur Auflistung aller Module in meinem System installiert verwendet. Es werden jedoch keine XML-Module aufgelistet.

Folgendes wird jedoch ordnungsgemäß ausgeführt.

perl -e "use XML::Simple " 

Was könnte das Problem sein?

+0

@Sinan: Sie haben die Frage ein wenig zu viel geändert. Ich denke, die ursprüngliche Frage war, wie man herausfinden kann, wo ein Modul installiert ist. Jetzt ist es, ob ein Modul installiert ist. – innaM

+0

Ich habe wirklich keine Ahnung. Aber angesichts der aktuellen Frage ist Ihre Antwort bisher die beste. Vielleicht können uns Chells aufklären. – innaM

+1

@Sinan: Warum hast du von Perl-Modul zu Perl-Module reaguliert, wenn letzteres kaum genutzt wird? –

Antwort

74

Sie können für ein Moduls Installationspfad prüfen nach:

perldoc -l XML::Simple 

Das Problem mit Ihrem Einzeiler ist, dass es nicht rekursiv Verzeichnisse/Unterverzeichnisse durchquert. Daher erhalten Sie nur pragmatische Modulnamen als Ausgabe.

+1

Natürlich funktioniert dies nur, wenn das Modul, das Sie suchen, POD enthält. – innaM

+1

@Manni: Sollte mit den meisten Modulen (von CPAN) arbeiten, da sie alle dokumentiert sind. –

+1

Einige von ihnen sind so gut dokumentiert, dass sie ihre Dokumente in ihren eigenen .pod-Dateien haben. Es ist ein netter Trick, der die meiste Zeit mit diesem einen kleinen Gotcha funktioniert. – innaM

8

Was Sie dort tun, ist nicht in Verzeichnisse rekursiv. Es zeigt nur die Module im Stammverzeichnis des Verzeichnisses @INC.

Das Modul XML::Simple wird in einem der @INC Pfade unter XML/Simple.pm leben.

Was er oben sagte, um spezifische Module zu finden.

CPAN erläutert, wie Sie hier alle Module finden, siehe How to find installed modules.

+1

+1 für das Problem mit dem OP-Code zu erklären. –

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

Vom perlvar Eintrag der %INC:

  • % INC

Der Hash %INC enthält Einträge für jeden Dateinamen über die do enthalten, require oder use Betreiber . Der Schlüssel ist der von Ihnen angegebene Dateiname (mit Modulnamen, die in Pfadnamen konvertiert wurden), und der Wert ist der Speicherort der gefundenen Datei. Der Operator verwendet diesen Hash, um festzustellen, ob eine bestimmte Datei bereits enthalten ist.

Wenn die Datei über einen Hook geladen wurde (z. B. eine Subroutinenreferenz, siehe require für eine Beschreibung dieser Hooks), wird dieser Hook standardmäßig anstelle eines Dateinamens in %INC eingefügt. Beachten Sie jedoch, dass der Hook den% INC-Eintrag möglicherweise selbst gesetzt hat, um einige genauere Informationen bereitzustellen.

+0

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

3

while (< @INC>)

Diese Pfade in @INC schließt sich zusammen in einer Zeichenkette, die durch Leerzeichen getrennt sind, dann ruft glob() auf die Saite, die dann iteriert durch die durch Leerzeichen getrennten Komponenten (es sei denn, es gibt file-globbing-Metazeichen.)

Dies funktioniert nicht so gut, wenn es Pfade in @INC gibt, die Leerzeichen enthalten, \, [], {}, *,?Oder ~, und es scheint keinen Grund zu sein, die sichere Alternative zu vermeiden:

for (@INC) 
6

Wenn Sie schnell überprüfen möchten, ob ein Modul (zumindest auf Unix-Systemen mit Bash als Shell) installiert ist, hinzufügen dies Ihre .bashrc:

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" 

Dann können Sie:

=> modver XML::Simple 
No module found 

=> modver DBI 
Version 1.607 
+0

Ich liebe das. Vielen Dank. – Anthony

31

Schnell und schmutzig:

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

Obwohl, wenn Sie die Version möchten, sagen die meisten Leute "Perl -MModule \ 999". – jrockway

+0

Zum anonymen Editor: Der richtige Weg wäre 'Perl -MDigest :: SHA -e 1' anstatt' perl -Digest :: SHA -e 1'. –

+1

Diesen benutze ich die ganze Zeit, obwohl ich normalerweise einen '-e 'drucke (\" hab \ n \ ")" ' – Lucas

3

Wenn Sie unter Windows ausführen:

  • C:\>ppm query * eine Liste aller installierten Module

  • C:\>ppm query XML-Simple zu überprüfen, um zu bekommen, wenn XML::Simple installiert ist

9

Für Um beispielsweise zu prüfen, ob das DBI-Modul installiert ist, verwenden Sie

perl -e 'use DBI;' 

Wenn nicht installiert, wird ein Fehler angezeigt. (von http://www.linuxask.com)

0

Ich glaube, dass Ihre Lösung nur in der Wurzel jedes Verzeichnis-Pfads im @ INC-Array suchen wird. Sie brauchen etwas, rekursiv, wie:

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

Bravo für @ user80168-Lösung (ich noch \ ‚s verlasse mich!), Aber alle Beteiligten das entweichende mit Aliase und Muscheln zu vermeiden:

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

Werke einigermaßen gut.

Hier könnte die einfachste und „modernen“ Ansatz, mit Module::Runtime:

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

Dies wird einen nützlichen Fehler, wenn das Modul nicht installiert ist.

Die Verwendung von -MModule::Runtime erfordert die Installation (es ist kein Kernmodul).

Verwandte Themen