Программист решил написать класс для работы с файлами конфигураций. Готов первый прототип: можно загружать и записывать yaml-файлы, читать и менять отдельные значения.
Программист решил протестировать, что получается:
Но скрипт не заработал. Совсем.
Почему?
Можно скачать исходный код: модуль Config.pm, скрипт script.pl, пример данных conf.yaml.
Например, на компьютере одного из авторов скрипт завершается с сообщением
Впрочем, если переместить файл Config.pm в другой каталог
и подключить его с помщью use lib
, скрипт начинает работать.
Дело в том, что в стандартной поставке perl с 1996 года присутствует модуль Config
,
предназначенный для чтения конфигурационных переменных perl’а.
Текущий каталог (.
) находится в самом конце массива @INC
,
поэтому при загрузке модуля через use Config
perl находит стандартный модуль
раньше, чем модуль из текущего каталога.
Изменить порядок поиска модулей можно с помощью прагмы lib
.
Результатом use lib
является добавление каталога в начало
массива @INC
, поэтому модули оттуда будут находиться раньше стандартных.
Тем не менее, во избежание неприятных сюрпризов лучше не давать своим модулям имена, уже занятые стандартной поставкой или популярными модулями с CPAN.
Примечания
Историю модуля Config в разных версиях perl см., например, здесь. Кстати, посмотрите и на остальные стандартные модули.
Смотрим порядок обхода каталогов при загрузке модулей:
К слову, use lib "/some/dir"
– это практически то же самое,
что BEGIN { unshift(@INC, "/some/dir") }
. О небольшой разнице см.
perldoc lib.
Также признаемся, что на составление этой задачи нас вдохновил топик на StackOverflow: What is the error in this object oriented program?.