ПрограммированиеBackend разработчик

Какие способы организации и импорта модулей существуют в Perl? Как работает система @INC и use/require? Приведите пример создания и подключения собственного модуля.

Проходите собеседования с ИИ помощником Hintsage

Ответ

Для организации кода на Perl используют модули (packages), которые оформляются в отдельных файлах с расширением .pm.

  • Для подключения модуля применяют use (на этапе компиляции) и require (на этапе выполнения).
  • При поиске модуля Perl использует специальный массив @INC — это список директорий, где Perl ищет модули.

Пример модуля:

Foo.pm

package Foo; use strict; use warnings; sub say_hello { print "Hello from Foo! "; } 1;

Подключение и использование:

use lib '.'; # Добавляет текущую папку в @INC use Foo; Foo::say_hello(); # Выводит: Hello from Foo!

Основные отличия:

  • use импортирует модуль в начале выполнения скрипта и автоматически вызывает метод import, если есть.
  • require загружает модуль только при первом вызове.

Вопрос с подвохом

В чем разница между use и require? Когда какой оператор применять?

Ответ:

  • use — действует на этапе компиляции, автоматически вызывает import (обычно используется для модулей).
  • require — действует во время исполнения, нужен, когда имя модуля неизвестно до выполнения или его не всегда надо подключать.

Примеры реальных ошибок из-за незнания тонкостей темы


История

В крупном проекте подключили собственную библиотеку через require, забыв, что она использует экспортируемые функции. Используемая функция не была экспортирована, потому что require не вызывает import. Результат — не работает импорт символов, приходится вызывать функции явно.


История

При переносе модуля в отдельную папку забыли добавить путь к папке через use lib или изменить переменную @INC. Модуль не находился, скрипт завершался с ошибкой, даже несмотря на то что файл лежал в правильном месте относительно проекта.


История

В старом приложении назвали модуль с маленькой буквы, а подключили через use с большой: use foo; вместо use Foo;. Perl не нашёл модуль, из-за чего работоспособность критических частей приложения была нарушена.