В Perl лучше использовать модуль, чем запрашивать файл?

49

Еще один вопрос заставил меня задуматься о различных методах повторного use кода: 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"? Почему или почему нет?
  • 0
    Вы имели в виду require Module или, возможно, do "file" вместо require "file" ?
  • 0
    @Michael, require "file" самом деле использует do "file" для обработки своего arugment, но он будет работать с данным файлом только один раз.
Показать ещё 2 комментария
Теги:

5 ответов

64
Лучший ответ

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

6

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

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

5

Основное различие заключается в импорте/экспорте. 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 для использования более подробно.

  • 0
    На самом деле, они одно и то же. В вашем примере MyModule::import() принимает qw(foo bar baz) и выполняет сам экспорт. Это то же самое средство, Exporter и Sub::Exporter просто генерируют import() .
2

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

0

У меня есть вопрос о хэше, о хэше, хеше массива, массиве массива и массиве хэша, мне нужно полное объяснение с программами

Ещё вопросы

Сообщество Overcoder
Наверх
Меню