Что делает 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 );
Для дальнейшего использования, пожалуйста, включите сообщения об ошибках, и вместо того, чтобы просто сказать, что что-то не работает.