Почему Perl не находит мой скрипт, когда я использую ключ -I? - PullRequest
0 голосов
/ 26 сентября 2010

Я нашел способ сделать такое.

Я использую эту команду оболочки:

perl -I/p2 maxconnect4.p1 arg1 arg2 arg3 arg4

Все мои файлы pl и pm находятся в каталоге "p2".

Однако, это выдает ошибку:

Can't open perl script "maxconnect4.pl": No such file or directory

Кто-нибудь может объяснить, почему?

Ответы [ 2 ]

5 голосов
/ 27 сентября 2010

У вас есть две проблемы:

  1. -I не относится к файлам, указанным в командной строке, только к модулям, загруженным с require или use.

  2. Вы не должны использовать относительные каталоги с -I.Если ваш сценарий выполняет chdir, то этот каталог теперь относится к текущему каталогу new , а не к текущему на момент запуска сценария.(Во многих случаях вы можете избежать нарушения этого правила, потому что большую часть времени модули загружаются при запуске сценария до того, как он изменил каталоги.)

    И вы на самом деле не используете относительноекаталог в любом случае, потому что вы сказали -I/p2, что означает поиск в каталоге с именем /p2, а не в подкаталоге с именем p2 в текущем каталоге (что вы и хотели сказать).

Попробуйте:

perl -I$PWD/p2 p2/maxconnect4.pl arg1 arg2 arg3 arg4

(при условии, что вы используете оболочку типа Unix).

Во многих случаях лучшим решением является настройка скрипта@INC автоматически.Вверху p2/maxconnect4.pl (перед загрузкой любых модулей из p2 поставьте):

use FindBin;
use lib $FindBin::Bin;

use lib - это программная версия переключателя -I FindBin сообщает вашему сценарию путь к каталогу, в котором он находится.Тогда вы можете просто сказать:

perl p2/maxconnect4.pl arg1 arg2 arg3 arg4

и вообще не беспокоиться о -I.

3 голосов
/ 26 сентября 2010

perl нужен реальный файл для выполнения. Вы должны вызвать его по абсолютному или относительному пути:

perl -I p2 p2/maxconnect4.pl arg1 arg2 arg3 arg4
...