2008-12-04 6 views

Odpowiedz

66

Tak, %INC zawiera pełną ścieżkę, z której został załadowany moduł.

Przykład:

$ perl -M'Data::Dump qw(pp)' -e 'pp(\%INC)' 
{ 
    "Data/Dump.pm"   => "/usr/share/perl5/Data/Dump.pm", 
    "Exporter.pm"   => "/usr/share/perl/5.10/Exporter.pm", 
    "List/Util.pm"   => "/usr/lib/perl/5.10/List/Util.pm", 
    "Scalar/Util.pm"  => "/usr/lib/perl/5.10/Scalar/Util.pm", 
    "XSLoader.pm"   => "/usr/lib/perl/5.10/XSLoader.pm", 
    "overload.pm"   => "/usr/share/perl/5.10/overload.pm", 
    "strict.pm"   => "/usr/share/perl/5.10/strict.pm", 
    "vars.pm"    => "/usr/share/perl/5.10/vars.pm", 
    "warnings.pm"   => "/usr/share/perl/5.10/warnings.pm", 
    "warnings/register.pm" => "/usr/share/perl/5.10/warnings/register.pm", 
} 
+0

nauczysz się czegoś nowego każdego dnia. –

+2

perl -MData :: Dump = pp -e 'pp (\% INC)' –

+0

Twoja wersja wygrywa w golfie :-D – derobert

1

Z tego co znalazłem, Perl będzie wyglądać w katalogach obrębie ścieżki:

perl -le 'print foreach @INC' 

Wtedy to będzie wyglądać w bibliotece standardowej, a następnie w bieżącym katalogu.

Daje to polecenie wyszukiwania.

Moje źródło:

Extending the library path

3

Istnieje spora liczba modułów w CPAN do takich informacji, najbardziej prawdopodobnymi kandydatami wyglądać będzie Module :: Znajdź moduł :: Jakie działania i moduł: :Znajdź. pewnie bym go z Module :: Znajdź:

use strict; 
use warnings; 
use Module::Locate qw/locate/; 

my $to_find = "Some::Module"; 

print "Perl would use: ", scalar locate($to_find), "\n"; 

W kontekście listowym zlokalizować zwraca wszystkie znalezione kopie niektórych :: Module w porządku opartego na @ INC.

Edytuj: derobert suggests a much better way, Nie zdawałem sobie sprawy z tego, że% INC już to zrobił ... To rozwiązanie modułowe byłoby przydatne, gdybyś chciał wiedzieć przed załadowaniem modułu, z którego ma być załadowany.

0

Module::Mapper zapewnia sposób chodzenia drzewa @ INC znaleźć moduły:

perl -MModule::Mapper -MData::Dumper \ 
-e 'print Dumper(find_sources(UseINC => 1, Modules => [ @ARGV ]))' \ 
list-of-modules-to-locate 
5

chcesz wyglądać w zmiennej %INC, który rejestruje nazwę pliku jest załadowany do biblioteki załadowane za pomocą do, require lub use. Aby uzyskać szczegółowe informacje, patrz perlvar.

7

Jeśli moduł zawiera dokumentację strąk, a jeśli można zagwarantować, że narzędzie perldoc w PATH należy do tej samej Perla, który jest uruchomiony skrypt, to polecenie będzie często daje rzeczywisty plik jest znaleziono:

perldoc -l ModuleName 
3

Oto jedna wkładka (z obwolutą bash), aby ustalić, czy zainstalowany jest moduł - i gdzie zostanie on załadowany z:

#!/bin/bash 
perl -M${1} -le "\$mname=\"${1}.pm\";\$mname=~s#::#/#g;print \"$1 INSTALLED AT \$INC{\$mname}\";" 2>/dev/null || echo "${1} NOT INSTALLED" 

Nazwać z Perl nazwa moduł składnię:

./find_perl_module Font::Metrics::Courier 
6

perl -M'LWP '-e' use Dane :: Dumper; drukuj Dumper \% INC '| grep LWP

Spowoduje to wyświetlenie lokalizacji modułu LWP na dysku oraz listę modułów załadowanych do LWP.

 'LWP.pm' => '/usr/lib/perl5/5.10.0/LWP.pm', 
     'LWP/Protocol.pm' => '/usr/lib/perl5/5.10.0/LWP/Protocol.pm', 
     'LWP/UserAgent.pm' => '/usr/lib/perl5/5.10.0/LWP/UserAgent.pm', 
0

używam skrypt/usr/local/bin/which_perl_module

#!/bin/sh 

if [ ! $1 ];then echo "Which perl module should I look for?"; exit; fi 

echo -n "You are using: " 
perldoc -l $1 
echo "which I found by looking in:" 
perl -MData::Dump=pp -e 'unshift @INC, '$1'; pp(\@INC)' 
Powiązane problemy