Если это записано в.NET и скомпилировано в CIL, это может быть отражено. Если безопасность является беспокойством, и путаницы нужно избежать, то я рекомендую писать Ваше приложение с помощью неуправляемого языка, который является должным, по своей природе, тяжелее перепроектировать.
использование происходит во время компиляции, а не во время выполнения, поэтому ваша переменная еще не установлена. Вы можете сделать:
my $curr_lib;
BEGIN {
$curr_lib = $0;
$curr_lib =~ s/myapp\.pl/libx/;
}
use lib $curr_lib;
или:
use FindBin;
use lib "$FindBin::Bin/libx";
У меня тоже были проблемы с этим раньше. Происходит то, что Perl выполняет два прохода по вашему коду: один раз для его компиляции, а второй - для его запуска. В вашем примере строки 4,5 и 6 не выполняются до времени выполнения, но использование
вступает в силу во время компиляции.
Одна из возможностей - поместить все это в блок BEGIN {}
, который заставит код выполняться во время компиляции. Я сделал это, но это грязно / некрасиво. (Кстати, вместо $ 0
вам нужно использовать $ ARGV [0]
в Perl).
Лучший способ указать Perl, где брать библиотеки, - это использовать -I
флаг. Вы можете поместить его в строку #!
, или, если вы запускаете скрипт из другого скрипта,
use xxx
- это директива времени компиляции , а не инструкция времени выполнения. Вы не можете установить его программно в запущенном вами сценарии.
Возможно, вам придется попробовать требовать, а не использовать
Если вам нужно использовать
, вам нужно установить $ Переменная среды PERL5LIB
, чтобы убедиться, что ваши модули правильно расположены и используются, или измените строку shebang на #! / usr / local / perl -w -I / путь / к / libx
. Существуют и другие методы ( local :: lib
и т.д.), но из вашего вопроса кажется, что ваш контроль над установкой немного ограничен для такого подхода.