В Perl лучше использовать модуль, чем запрашивать файл? - PullRequest
50 голосов
/ 02 февраля 2010

Другой вопрос заставил меня задуматься о различных методах повторного использования кода: use против require против do

Я вижу здесь много постов, где вопрос касается использования require для загрузки и выполнения кода. Это кажется мне очевидной плохой практикой, но я не нашел хороших ресурсов по этому вопросу, на которые я мог бы указать людям.

perlfaq8 охватывает разницу между use и require, но не дает никаких советов относительно предпочтений (по состоянию на 5.10 - в 5.8.8 Небольшой совет в пользу использования ).

Эта тема, похоже, страдает от недостатка обсуждения. У меня есть несколько вопросов, которые я бы хотел обсудить:

  1. Какой метод повторного использования кода предпочтителен в Perl?
    • use ModuleName;
    • require ModuleName;
    • require 'file.pl';
    • do 'file.pl';
  2. В чем разница между require ModuleName и require "file.pl"?
  3. Является ли когда-нибудь хорошей идеей использовать require "file.pl"? Почему или почему нет?

Ответы [ 4 ]

70 голосов
/ 02 февраля 2010

Стандартная практика - использовать 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, тогда как последняя форма ожидает, что имя файла начать с. Однако по соглашению первая форма используется для загрузки модулей, а вторая - для загрузки библиотек.

8 голосов
/ 02 февраля 2010

Существует основное предпочтение использования use, потому что это происходит в более раннем состоянии BEGIN {} во время компиляции, и ошибки, как правило, распространяются на пользователя в более подходящее время. Он также вызывает функцию sub import {}, которая позволяет вызывающему абоненту контролировать процесс импорта. Это то, что интенсивно используется. Вы можете получить тот же эффект, вызвав конкретное пространство имен import, но для этого необходимо, чтобы вы знали имя пространства имен и файл, а также кодировали вызов подпрограммы ... что намного сложнее. И наоборот, use просто требует, чтобы вы знали пространство имен, а затем он требует файл с соответствующим пространством имен, что делает связь между пространствами имен и файлами менее сознательной для пользователя.

Считайте perldoc -f use и perldoc -f require, для получения дополнительной информации. За perldoc -f use:
use - это то же самое, что и BEGIN { require Module; Module->import( LIST ); }, что намного страшнее.

6 голосов
/ 02 февраля 2010

Основное различие заключается в импорте / экспорте. use предпочтительнее, когда вы используете модуль, потому что он позволяет вам указать, какие подпрограммы вы хотите импортировать в ваше пространство имен:

use MyModule qw(foo bar baz); # allows foo(), bar() and baz() to be used

use MyModule qw(); # Requires explicit naming (e.g. MyModule::foo).

use также запускает процедуру import() модуля, которая часто используется для настройки модуля.

См. Perldoc для , используйте для более подробной информации.

3 голосов
/ 24 марта 2012

Использование use для модуля будет включать модуль во время компиляции, что увеличивает скорость, но использует больше памяти, тогда как использование require модуля будет включать во время выполнения. Требование модуля без использования импорта, когда это необходимо, требует меньше памяти, но снижает скорость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...