it-swarm.dev

Wie kann ich über die Befehlszeile überprüfen, ob ein Perl-Modul auf meinem System installiert ist?

Ich habe versucht zu überprüfen, ob XML :: Simple auf meinem System installiert ist oder nicht.

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

Der obige Einzeiler wurde verwendet, um alle in meinem System installierten Module aufzulisten. Es werden jedoch keine XML-Module aufgelistet.

Das Folgende funktioniert jedoch einwandfrei.

Perl -e "use XML::Simple "

Was könnte das Problem sein?

56
joe

Sie können den Installationspfad eines Moduls folgendermaßen überprüfen:

perldoc -l XML::Simple

Das Problem mit Ihrem Einzeiler ist, dass er Verzeichnisse/Unterverzeichnisse nicht rekursiv durchläuft. Daher erhalten Sie nur pragmatische Modulnamen als Ausgabe.

92

Schnell und dreckig:

$ Perl -MXML::Simple -e 1
39
Sinan Ünür
$ Perl -MXML :: Simple -le 'print $ INC {"XML/Simple.pm"}'

Ab dem perlvar Eintrag am %INC :

  • % INC

Der Hash %INC Enthält Einträge für jeden Dateinamen, der über die Operatoren do, require oder use eingegeben wird. Der Schlüssel ist der von Ihnen angegebene Dateiname (mit in Pfadnamen konvertierten Modulnamen), und der Wert ist der Speicherort der gefundenen Datei. Der Operator require 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 erforderlich für eine Beschreibung dieser Hooks), wird dieser Hook standardmäßig anstelle eines Dateinamens in %INC Eingefügt. Beachten Sie jedoch, dass der Hook möglicherweise den% INC-Eintrag selbst festgelegt hat, um spezifischere Informationen bereitzustellen.

17
Greg Bacon

Um beispielsweise zu überprüfen, ob das DBI-Modul installiert ist oder nicht, verwenden Sie

Perl -e 'use DBI;'

Sie werden Fehler sehen, wenn nicht installiert. (von http://www.linuxask.com )

12
Hamidjon

Was Sie dort tun, wird nicht in Verzeichnisse rekursiv übertragen. Es werden nur die Module im Stammverzeichnis des Verzeichnisses @INC Aufgelistet.

Das Modul XML::Simple Befindet sich in einem der Pfade @INC Unter XML/Simple.pm.

Was er oben sagte, um bestimmte Module zu finden.

CPAN erklärt, wie Sie hier alle Module finden, siehe So finden Sie installierte Module .

9
Salgar

Wenn Sie schnell überprüfen möchten, ob ein Modul installiert ist (zumindest auf Unix-Systemen mit Bash als Shell), fügen Sie Folgendes zu Ihrer .bashrc-Datei hinzu:

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"

Dann kannst du:

=> modver XML::Simple
No module found

=> modver DBI
Version 1.607
8
user80168

Wenn Sie ActivePerl unter Windows ausführen:

  • C:\>ppm query *, um eine Liste aller installierten Module zu erhalten

  • C:\>ppm query XML-Simple um zu prüfen, ob XML::Simple ist installiert

3
Zaid

while (<@INC>)

Dadurch werden die Pfade in @INC in einer durch Leerzeichen getrennten Zeichenfolge miteinander verbunden. Anschließend wird in der Zeichenfolge glob () aufgerufen, das dann die durch Leerzeichen getrennten Komponenten durchläuft (es sei denn, es gibt Datei-Globbing-Metazeichen).

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

for (@INC)
3
ysth

Bravo für @ user80168s Lösung (ich zähle noch \ 's!), aber um das Entkommen von Aliasen und Shells 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

funktioniert einigermaßen gut.

Hier könnte der einfachste und "modernste" Ansatz mit Module::Runtime :

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

Dies führt zu einem nützlichen Fehler, wenn das Modul nicht installiert ist.

Mit -MModule::Runtime setzt voraus, dass es installiert ist (es ist kein Kernmodul).

0
G. Cito

Ich glaube, Ihre Lösung wird nur im Stammverzeichnis jedes im @ INC-Array enthaltenen Verzeichnispfads suchen. Sie benötigen etwas Rekursives wie:

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