Использование qw (:const) с инструкцией use

#perl

#perl

Вопрос:

Извините за очень простой вопрос, но я новичок в Perl и не смог найти подходящего объяснения на SO (или где-либо еще!) для этого вопроса. Я понимаю, что могу написать несколько примеров и попытаться расшифровать это, но мне действительно могут пригодиться некоторые знания от экспертов.

Я просматриваю некоторый код, в котором разработчик использовал библиотеки, использующие:

 use libExample qw(:const)
  

Теперь, насколько я понимаю, это означает получение констант из libExample, но действительно хотелось бы знать, как это работает.

  1. Почему я не могу просто сказать: use libExample qw(const) (Пытаясь понять актуальность : )

  2. Есть ли что-то, что мы можем / должны написать в 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 подробно рассмотрел пример, который, я предлагаю всем прочитать, но принимаю это как ответ, поскольку это более точный и объясненный по существу, что сразу же развеяло мои сомнения.