w Perlu, kiedy znajdę use <module name> <ver>;
, system znajdzie plik .pm
dla biblioteki gdzieś w ścieżce @INC
.Jak znaleźć, który plik został załadowany do Perla, gdy korzystam z modułu?
Czy istnieje niezawodny sposób załadowania pliku?
w Perlu, kiedy znajdę use <module name> <ver>;
, system znajdzie plik .pm
dla biblioteki gdzieś w ścieżce @INC
.Jak znaleźć, który plik został załadowany do Perla, gdy korzystam z modułu?
Czy istnieje niezawodny sposób załadowania pliku?
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",
}
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:
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.
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
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.
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
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
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',
Można użyć polecenia instmodsh: http://perldoc.perl.org/instmodsh.html.
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)'
nauczysz się czegoś nowego każdego dnia. –
perl -MData :: Dump = pp -e 'pp (\% INC)' –
Twoja wersja wygrywa w golfie :-D – derobert