Для организации кода на Perl используют модули (packages), которые оформляются в отдельных файлах с расширением .pm.
use (на этапе компиляции) и require (на этапе выполнения).@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 не нашёл модуль, из-за чего работоспособность критических частей приложения была нарушена.