Что делает qw(:everything) в строке использования в perl?

Это неудобный вопрос, но почему эта линия работает, а другая нет?

Рабочая линия:

use strict;
use warning;
use Wx qw(:everything);
my $dialog = Wx::MessageDialog->new(
    $self,
   "About test\n" .  "Version 0.01\n",
   "About Test",
   wxOK | wxCENTRE
);

Нерабочая линия:

use strict;
use warning;
use Wx;
my $dialog = Wx::MessageDialog->new(
   $self,
   "About test\n" .  "Version 0.01\n",
   "About Test",
   wxOK | wxCENTRE
);

Сообщение об ошибке из нерабочей строки:

Bareword "wxOK" not allowed while "strict subs" in use at test.pl line 123.
Bareword "wxCENTRE" not allowed while "strict subs" in use at test.pl line 123.
BEGIN not safe after errors--compilation aborted at test.pl line 348.

2 ответа

Решение

Это эквивалент этого:

BEGIN {
    require 'Wx';
    Wx->import( ':everything' );
};

Этот код импортирует ": все" из Wx в текущее пространство имен. Я предполагаю, что Wx использует Exporter и имеет группу вещей для импорта, когда вызывается с помощью ": все".

Вы можете проверить источник Wx и источник Exporter, чтобы попытаться понять это.

Я пропустил ваш рабочий / нерабочий пример. Неработающий не работает, потому что wxOK а также wxCENTRE константы не импортируются в текущее пространство имен. Это делается с помощью Exporter, как описано выше.

qw(:everything)

очень похоже на

(split ' ', ':everything')

Так

use Wx qw(:everything);

такой же как

use Wx ':everything';

Строка :everything передается в процедуру экспорта Wx (import). Семантика полностью зависит от модуля, но я предполагаю, что Wx определяет его как "экспортировать все, что я могу экспортировать". Большинство модулей используют :ALL для этого, если они предоставляют это вообще.

Похоже, что Wx ничего не экспортирует, если вы не спросите, поэтому wxOK а также wxCENTRE не существует в вашем пространстве имен, если вы не скажете Wx экспортировать их, используя

use Wx qw( wxOK wxCENTRE );

или же

use Wx qw( :everything );

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

Другие вопросы по тегам