Ответ 1
Стандартная практика - использовать use
большую часть времени, require
иногда и do
редко.
do 'file'
выполнит file
как Perl script. Это почти как вызов eval
по содержимому файла; если вы do
тот же файл несколько раз (например, в цикле), он будет анализироваться и оцениваться каждый раз, что вряд ли будет тем, что вы хотите. Разница между do
и eval
заключается в том, что do
не может видеть лексические переменные в охватывающей области, что делает ее более безопасной. do
иногда полезен для простых задач, таких как обработка файла конфигурации, написанного в виде кода Perl.
require 'file'
похож на do 'file'
, за исключением того, что он будет анализировать только один конкретный файл один раз и будет вызывать исключение, если что-то пойдет не так. (например, файл не может быть найден, он содержит синтаксическую ошибку и т.д.). Автоматическая проверка ошибок делает ее хорошей заменой для do 'file'
, но она по-прежнему подходит только для тех же простых целей.
Формы do 'file'
и require 'file'
являются переносами с прошлых дней, когда расширение файла *.pl означало "Perl Library". Современный способ повторного использования кода в 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
, в то время как последняя форма ожидает, что имя файла будет начните с. По соглашению, однако, первая форма используется для загрузки модулей, а вторая форма используется для загрузки библиотек.