2009-08-18 14 views
5

W mojej aplikacji umieściłem wszystkie moduły w jednym katalogu, nazwijmy go: libx. Ponieważ od użytkownika zależy, gdzie wybrać aplikację, nie chcę kodować ścieżki lib.Dlaczego "use lib" nie działa w ten sposób?

Tak więc na początku myapp.pl, napisałem następujące wiersze kodu.

#! /usr/bin/perl -w 
use strict; 

my $curr_dir = $0; 
my $curr_lib = $curr_dir; 
$curr_lib =~ s/myapp\.pl/libx/; 

use $curr_lib ; 

Zamiast uzyskać to, czego się spodziewam, mam błędy kompilacji!

Co jest nie tak z moim kodem? Nie chcę kodować ścieżki biblioteki przy korzystaniu z use lib, jak mam to zrobić?


Niestety zapomniałem wspomnieć, że gdy aplikacja jest wdrażany, myapp.pl i libx są w tym samym katalogu.

Odpowiedz

15

użycie dzieje się podczas kompilacji, a nie w czasie wykonywania, więc zmienna nie została jeszcze ustawiona. można zrobić:

my $curr_lib; 
BEGIN { 
    $curr_lib = $0; 
    $curr_lib =~ s/myapp\.pl/libx/; 
}  
use lib $curr_lib; 

lub możesz:

use FindBin; 
use lib "$FindBin::Bin/libx"; 
2

Również miałem z tym problemy. Co się dzieje, to że Perl wykonuje dwa przejścia przez twój kod: raz, aby go skompilować, i drugi raz, aby go uruchomić. Na przykład, wiersze 4,5 i 6 nie są wykonywane do czasu wykonywania, ale use zaczyna obowiązywać podczas kompilacji.

Jedną z możliwości jest umieszczenie wszystkiego wewnątrz bloku BEGIN{}, co spowoduje wykonanie kodu podczas kompilacji. Zrobiłem to, ale jest brudny/brzydki. (BTW, zamiast $0, musisz użyć $ARGV[0] w Perlu).

Najlepszym sposobem poinformowania Perla, gdzie można pobrać biblioteki, jest użycie flagi -I. Można umieścić go na linii #!, lub jeśli zaczynają skrypt z innego skryptu, można uruchomić go jako

 
perl -I/your/directory/libx your_script.pl 

You może używać względnych ścieżek, więc może

 
perl -I./libx script.pl 

będzie praca dla Ciebie.

+0

Pomoże nam, jeśli powiesz nam dokładnie, w jaki sposób możesz oczekiwać, aby Twój użytkownik uruchomił aplikację. Czy po prostu wpisują "myapp".pl ', i to od nich zależy, czy ustawimy $ PATH, aby myapp.pl można było znaleźć w katalogu, w którym go utkwili? –

1

use xxx jest kompilacji dyrektywa, a nie instrukcja run-time. Nie można go ustawić programowo w uruchomionym skrypcie.

Może trzeba spróbować require rather than use

Jeśli potrzebujesz use, trzeba ustawić zmienną środowiskową $PERL5LIB aby zapewnić twoje moduły są prawidłowo umieszczony i używany, lub zmienić linię shebang czytać #! /usr/local/perl -w -I/path/to/libx. Istnieją inne metody (local::lib itd.), Ale z twojego pytania wynika, że ​​twoja kontrola nad instalacją jest nieco ograniczona do tego rodzaju podejścia.

+1

To nie jest w 100% prawdziwe, możesz użyć ciągu 'eval', aby wykonać' use' w czasie wykonywania. –

Powiązane problemy