#perl
#perl
Вопрос:
Извините за очень простой вопрос, но я новичок в Perl и не смог найти подходящего объяснения на SO (или где-либо еще!) для этого вопроса. Я понимаю, что могу написать несколько примеров и попытаться расшифровать это, но мне действительно могут пригодиться некоторые знания от экспертов.
Я просматриваю некоторый код, в котором разработчик использовал библиотеки, использующие:
use libExample qw(:const)
Теперь, насколько я понимаю, это означает получение констант из libExample, но действительно хотелось бы знать, как это работает.
-
Почему я не могу просто сказать:
use libExample qw(const)
(Пытаясь понять актуальность:
) -
Есть ли что-то, что мы можем / должны написать в
libExample.pm
самом по себе, чтобы заставить других разработчиков, использующих эту библиотеку, упоминать такие параметры вместо const, то есть.
Спасибо!
Комментарии:
1. Попробуйте это: perldoc.perl.org/Exporter.html
2. @rubikonx9: Вам следует объяснить это более подробно и включить в ответ.
Ответ №1:
Синтаксис use Foo qw(:const)
использует функцию EXPORT_TAGS в экспортере.
Когда вы настраиваете свой библиотечный модуль, у вас обычно есть набор функций или переменных класса. Затем вы настраиваете экспортер, сообщая ему, что экспортировать по умолчанию
package Foo;
use Exporter;
our @EXPORT = qw( frobnicate );
sub frobnicate { ... }
или когда они запрашиваются.
OUR @EXPORT_OK = qw( frobnicate barnicate );
sub barnicate { ... }
Но вы также можете указать ему группировать вещи вместе, поэтому пользователю вашей библиотеки не нужно перечислять все методы. Рассмотрим этот пример.
package Foo;
use Exporter;
our @EXPORT_OK qw(monday tuesday wednesday thursday friday saturday sunday);
sub monday { ... }
sub tuesday { ... }
sub wednesday { ... }
sub thursday { ... }
sub friday { ... }
sub saturday { ... }
sub sunday { ... }
Теперь, если бы я хотел использовать все рабочие дни, мне пришлось бы сделать это:
use Foo qw(monday tuesday wednesday thursday friday);
Это одна длинная строка. Вместо этого было бы очень полезно, если бы их можно было сгруппировать. Ну, они могут быть. Если вы сделаете это вместо этого в своей библиотеке:
package Foo;
use Exporter;
our %EXPORT_TAGS = (
working_days => [
qw(monday tuesday wednesday thursday friday)
],
weekend_days => [
qw(saturday sunday)
]
);
# ...
Затем мы можем использовать его с одним тегом вместо пяти имен функций:
use Foo qw(:working_days);
Обратите внимание, что это эквивалентно:
use Foo ':working_days';
Ответ №2:
use libExample qw(:const)
выберет все имена в $EXPORT_TAGS{const}
анонимном массиве и импортирует их в текущее пространство имен.
В то время как
use libExample qw(const)
выберет const и импортирует его в текущее пространство имен.
Существуют и другие варианты:
[!]name This name only
[!]:DEFAULT All names in @EXPORT
[!]:tag All names in $EXPORT_TAGS{tag} anonymous array
[!]/pattern/ All names in @EXPORT and @EXPORT_OK which match
Пожалуйста, ознакомьтесь с документацией экспортера для получения более подробной информации по теме.
Комментарии:
1. simbabque подробно рассмотрел пример, который, я предлагаю всем прочитать, но принимаю это как ответ, поскольку это более точный и объясненный по существу, что сразу же развеяло мои сомнения.