5.26 примечания perldelta

огда полностью не понимал разрешение имен пакетов в Perl, но я всегда предполагал, что всегда должно работать следующее, предполагая, что вы выполняете myscript.pl из каталога, в котором он находится:

myscript.pl (contains the following statement: use Class1::Class2::Class3)
Class1/
    Class2/
        Class3.pm (contains the following package declaration: package Class1::Class2::Class3;)

Тем не менее, это не работает в моем коде, потому что Class3.pm не может быть найден. Глядя на @INC, он не включает в себя текущий каталог, только различные каталоги моей установки Strawberry Perl.

Каков рекомендуемый способ решить эту проблему? Я полагаю, я мог бы изменить @INC, или я мог бы начать использовать FindBin, но я не уверен, что лучше. Я унаследовал этот код и просто перенес его в новое место, но не похоже, чтобы старому коду требовалось такое решение (я могу ошибаться, все еще глядя ...)

Ответы на вопрос(3)

. (текущий каталог) в@INC былудалено в 5.26 по соображениям безопасности (CVE-2016-1238). Некоторые дистрибутивы Linux перенесли изменения, поэтому вы можете столкнуться с этой проблемой, даже если вы используете, например, например, 5,24.

 melpomene03 окт. 2017 г., 19:42
@ikegami Ох, интересно. Я не знал, что FindBin был исправлен. Сделалпоиск$PATH до версии 1.51, выпущенной с Perl 5.16.
 melpomene03 окт. 2017 г., 19:45
@ikegami Я забрал свой код. ТвойFindBin решение лучше (при условии, что это по крайней мере версия 1.51, такuse FindBin 1.51 qw($RealBin) может быть хорошая идея).
Решение Вопроса

по крайней мере, больше. Текущий каталог был удален из@INC в 5.26 по соображениям безопасности.

Тем не менее, любой код, который полагается на текущий каталог находится в@INC глючил задолго до 5.26. Код, который сделал это, как и ваш, неправильно использовал текущий каталог в качестве прокси для каталога скрипта. Это предположение часто неверно.

Чтобы заставить Perl искать в каталоге скрипта модули, используйте следующее:

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

или же

use Cwd qw( abs_path );
use File::Basename qw( dirname );
use lib dirname(abs_path($0));
 textral29 авг. 2018 г., 02:52
Что касается вашего второго варианта, я всегда использовал нечто подобное:use Cwd(); use File::Basename(); use lib Cwd::realpath(File::Basename::dirname(__FILE__)); Что лучше: твой или мой?
 ikegami09 апр. 2018 г., 14:26
@sundar,$Bin не будет работать, если кто-то создаст символическую ссылку на скрипт.
 ikegami11 апр. 2018 г., 07:53
@ Грег Кеннеди, это проверка версии. Увидетьuse Module VERSION LIST синтаксисuse.
 sundar09 апр. 2018 г., 14:19
Тангенциальный вопрос, но почему$RealBin и не только$Bin? Разрешает ли использование здесь разрешенных ссылок, или вы использовали это здесь только в качестве общей хорошей практики?
 Greg Kennedy11 апр. 2018 г., 07:38
Что такое аргумент 1,51 вFindBin? Я не вижу ничего подобного, упомянутого вPerldoc для FindBin.

@INC в качестве меры безопасности.

Это объясняется в5.26 примечания perldelta.

Ваш ответ на вопрос