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?
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.
Schnell und dreckig:
$ Perl -MXML::Simple -e 1
$ 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 Operatorendo
,require
oderuse
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 Operatorrequire
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.
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 )
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 .
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\\\[email protected]?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
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
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)
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).
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"`;
}'