2014-01-13 2 views
2

У меня есть куча скриптов, что мне нужно, чтобы запустить их в последовательном порядке Somthing как нижеДобавление модулей каталогов в @INC

foreach my (qw (script1.pl script2.pl script3.pl){ 

my $script=File::Spec->catfile($Bin,'Scripts',$_); 
system "$^X $script"; 
} 

каждый из этих сценариев использования 2 модулей, расположенных под Lib библиотеки, где скрипты найдено

У меня есть библиотека проектов, которые соответствуют приведенному выше сценарию и 2 директориям для моих модулей, а другая для скриптов, выполняемых вышеприведенным скриптом, вопрос, как добавить каталог модулей в путь @INC в динамическом в приведенном выше сценарии, что при запуске системного кода он найдет каталог lib по пути @INC. Я попытался использовать следующие:

BEGIN{ 
use lib File::Spec->catdir($Bin,'LIB'); 

} 

но его идеи не работают?

Я получаю ошибку для каждого сценария на петле

"BEGIN failed--compilation aborted at C:\Porject\Scripts\script1.pl line 4 
Can't locate Detection.pm in @INC" 
+3

Предоставьте полное сообщение об ошибке и полный путь к модулю, который вы пытаетесь загрузить. (Вы можете заменить личную информацию, если вам нужно, просто быть последовательным. Например, повсеместно заменяйте название вашей компании на «xxx» и ваше имя пользователя «yyy».) – ikegami

+0

Is Detection.pm в «Porject \ LIB»? – DVK

+0

Да, если я распечатаю файл :: Spec-> catdir ($ Bin, 'LIB'), я вижу, что он в правом каталоге – smith

ответ

5

Это не ясно, где вы manipullating @INC, но так, как я прочитал ваш вопрос, вы, кажется, сделал это в script.pl.

Простое изменение @INC родительского сценария не повлияет @INC сценариев вы звоните по system() вызова, поскольку эти дочерние scrips будет иметь свою собственную копию интерпретатора Perl.

Вам нужно манипулировать им в вызываемых скриптах (script1.pl, script2.pl, script3.pl).

Вы можете сделать это один из 3-х способов:

  1. Добавляя "-I" параметр Perl при вызове сценария из script.pl:

    my $lib_path = File::Spec->catdir($Bin,'LIB'); 
    system "$^X -I $lib_path $script"; 
    

    пособиях: Вы только поместите код в 1 скрипт (родительский).

    Из-за этого, это решение, которое я бы рекомендовал.

  2. Имея script1.pl (и 2 и 3), отрегулируйте свой собственный @INC на основе пути к скрипту.

    Например:

    use Cwd qw(abs_path); 
    use FindBin; 
    use lib abs_path("$FindBin::Bin/../LIB"); 
    

    Benefit: Вам не нужно знать ehere "$ Bin" есть. Downside: вам нужно отредактировать каждый из этих сценариев.

  3. Имея script1.pl (и 2 и 3) настроить свою собственную @INC на основе логики вы пытались ввести в родительский сценарий:

    # Add to scriptX.pl - all of them. 
    BEGIN { use lib File::Spec->catdir($Bin,'LIB'); } 
    

    Даунсайд 1: вам нужно редактировать каждый этих сценариев. Downside 2: Вам нужно знать, где «$ Bin» находится в каждом из этих сценариев.

Смежные вопросы