Что делает qw (: everything) в строке использования в perl? - PullRequest
2 голосов
/ 17 октября 2011

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

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

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 ]

13 голосов
/ 17 октября 2011

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

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

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

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

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

6 голосов
/ 17 октября 2011
qw(:everything)

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

(split ' ', ':everything')

So

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 );

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

...