Стандартная практика - использовать use
большую часть времени, require
иногда и do
редко.
do 'file'
выполнит file
как скрипт Perl. Это почти как вызов eval
для содержимого файла; если вы do
один и тот же файл несколько раз (например, в цикле), он будет анализироваться и оцениваться каждый раз, что вряд ли будет тем, что вы хотите. Разница между do
и eval
заключается в том, что do
не может видеть лексические переменные во внешней области видимости, что делает его более безопасным. do
иногда полезен для простых задач, таких как обработка файла конфигурации, написанного в форме кода Perl.
require 'file'
похож на do 'file'
за исключением того, что он будет только один раз анализировать любой конкретный файл и вызовет исключение, если что-то пойдет не так. (например, файл не может быть найден, он содержит синтаксическую ошибку и т. д.) Автоматическая проверка ошибок делает его хорошей заменой для do 'file'
, но он по-прежнему подходит только для тех же простых целей.
Формы do 'file'
и require 'file'
- это перенесенные из давних времен, когда расширение файла * .pl означало «Библиотека Perl». Современный способ повторного использования кода в Perl - это организовать его в модули. Называть что-то «модулем» вместо «библиотеки» - это просто семантика, но слова означают совершенно разные вещи в культуре Perl. Библиотека - это просто набор подпрограмм; модуль предоставляет пространство имен, что делает его более подходящим для повторного использования.
use Module
- это обычный способ использования кода из модуля. Обратите внимание, что Module
- это имя пакета как голое слово, а не строка в кавычках, содержащая имя файла. Perl обрабатывает перевод от имени пакета к имени файла для вас. use
операторы происходят во время компиляции и выдают исключение, если они терпят неудачу. Это означает, что если модуль, от которого зависит ваш код, недоступен или не загружается, ошибка будет видна немедленно. Кроме того, use
автоматически вызывает метод import()
модуля, если он есть, что может немного сэкономить при печати.
require Module
похоже на use Module
за исключением того, что это происходит во время выполнения и не вызывает автоматически метод import()
модуля. Обычно вы хотите использовать use
для преждевременного сбоя и предсказуемо, но иногда require
лучше. Например, require
может использоваться для задержки загрузки больших модулей, которые требуются только изредка, или для того, чтобы сделать модуль необязательным. (то есть используйте модуль, если он доступен, но прибегните к чему-то другому или уменьшите функциональность, если это не так.)
Строго говоря, единственная разница между require Module
и require 'file'
заключается в том, что первая форма запускает автоматический перевод имени пакета, например Foo::Bar
, в имя файла, например Foo/Bar.pm
, тогда как последняя форма ожидает, что имя файла начать с. Однако по соглашению первая форма используется для загрузки модулей, а вторая - для загрузки библиотек.