Perl: Включить текущий каталог в @ IN C? - PullRequest
2 голосов
/ 14 марта 2020

Я в процессе перемещения некоторых веб-сайтов со старого веб-сервера на новый веб-сервер. Старый веб-сервер использует Perl 5.8, новый веб-сервер использует Perl 5.28. Одно из различий между ними заключается в том, что в 5.8 каталог, из которого выполняется скрипт, по умолчанию включен в @ IN C. Не так с 5.28. Это означает, что сценарии cgi, которые «требуют» локальных файлов, выдают ошибку.

Я знаю, что могу добавить эти строки в сценарий для решения проблемы:

use FindBin qw( $RealBin );
use lib $RealBin;

, но проблема это то, что мне нужно сделать это для много сценариев.

Есть ли способ добавить текущий каталог (.) в @ IN C для всех скрипты в одном go? Желательно только для пользователя www-data? 1011 *

Ответы [ 2 ]

3 голосов
/ 14 марта 2020

Глобального решения не существует, поскольку путь, который вы хотите добавить, отличается для каждого сценария.

Можно было бы испытать желание добавить ., но . относится к текущему каталогу, а не к каталогу, содержащему сценарий. Это не правильно.


Вы можете исправить файлы, используя что-то вроде следующего:

# See what files will be modified.
find . -name '*.pl'

# Actually modify them.
find . -name '*.pl' -exec perl -pe'$_ .= "use FindBin qw( \$RealBin );\nuse lib \$RealBin;\n" if $. == 1' -i~ {} \;

Выше сделана резервная копия. Как только вы будете удовлетворены изменениями, вы можете удалить резервные копии, используя

# See what files will be deleted.
find . -name '*~'

# Actually delete them.
find . -name '*~' -delete
3 голосов
/ 14 марта 2020
export PERL_USE_UNSAFE_INC=1

Согласно perldelta :

PERL_USE_UNSAFE_INC

Существует новая переменная среды, распознаваемая интерпретатором perl. Если эта переменная имеет значение 1 при запуске интерпретатора perl, то "." будет автоматически добавлен к @ IN C (за исключением случаев порчи).

Это позволяет восстанавливать поведение старого интерпретатора perl в каждом конкретном случае. Но учтите, что это временный костыль, и эта функция, вероятно, будет удалена в какой-то будущей версии perl. В настоящее время он устанавливается утилитой cpan и Test :: Harness для упрощения установки модулей CPAN, которые не были обновлены для обработки отсутствия точки. Еще раз, не используйте это, если вы не уверены, что это не вызовет каких-либо проблем безопасности. Может быть, в безвыходном положении, когда вы находитесь, это может быть хорошо, так как вы уже находитесь в опасности безопасности; но я бы обязательно обновил файлы и сбросил эту переменную как можно скорее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...