2009-08-18 31 views
5

Uygulamamda, tüm modülleri bir dizine koydum, hadi sadece libx diyelim. Uygulamanın nereye yerleştirileceğini seçmek kullanıcı için olduğundan, lib yolunu kodlamak istemiyorum.Neden "lib kullan" bu şekilde etkili olmaz?

myapp.pl'un başında, aşağıdaki kod satırlarını yazdım.

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

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

use $curr_lib ; 

Beklediklerimi almak yerine, derleme hatalarım var!

Kodumdaki sorun nedir? use lib kullanırken lib yolunu kodlamak istemiyorum, bunu nasıl yapmalıyım?


Üzgünüm app dağıtıldığında, myapp.pl ve libx aynı dizinde olduğunu söylemeyi unutmuşum.

cevap

15

, derleme zamanında değil, çalışma zamanında gerçekleşir, bu nedenle değişkeniniz henüz ayarlanmamış.

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

veya yapabildin: bunu yapabilirsiniz

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

Daha önce bununla ilgili sorun yaşadım. Olan şey, Perl'in kodunuzun üzerinden iki kez geçmesidir: bir kez derlemek ve ikinci kez çalıştırmak için. Örneğin, çalışma zamanına kadar satır 4,5 ve 6 çalışmaz, ancak derleme sırasında use geçerli olur.

Bir olasılık, kodu derleme zamanında yürütecek olan BEGIN{} bloğunun içine koymaktır. Bunu yaptım, ama dağınık/çirkin. (BTW, $0 yerine, Perl'de $ARGV[0] kullanmanız gerekir).

Perl'e kütüphaneleri nereden alacağını söylemenin en iyi yolu, -I bayrağını kullanmaktır. olur

 
perl -I./libx script.pl 

belki, can kullanımı göreli yollar Sen #! hattı üzerine koyabilirsiniz, ya da başka bir komut dosyasından senaryoyu başlıyor eğer, sen

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

You olarak başlayabilir Senin için çalış.

+0

Kullanıcınızın uygulamayı başlatmasını nasıl beklediğinizi tam olarak anlatırsanız size yardımcı olur. Sadece yazacaklar mı myapp.pl 've $ PATH setine sahip olmak onlara kalmış, böylece myapp.pl onu hangi dizine tıkladıklarını bulabilir? –

1

use xxx bir derleme zamanı yönergesi değil, bir çalışma zamanı talimatıdır. Çalıştığınız komut dosyasında programsal olarak ayarlayamazsınız. Eğer use gerekiyorsa require rather than use

denemeniz gerekebilir

, kendi modülleri doğru yer ve kullanılmasını sağlamak, ya da #! /usr/local/perl -w -I/path/to/libx okumak için shebang hattını değiştirmek için $PERL5LIB ortam değişkeni ayarlamak gerekir. Başka yöntemler de var (local::lib vb.), Fakat sorunuzdan, kurulum üzerindeki kontrolünüz bu tarz bir yaklaşım için biraz sınırlı gibi görünüyor.

+1

Bu% 100 doğru değilse, çalışma zamanında bir 'use' yürütmek için' eval' dizgisini kullanabilirsiniz. –

İlgili konular