这是一个令人尴尬的问题,但是为什么这条线有效而另一条没有呢?
工作线:
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.
答案 0 :(得分:13)
它相当于:
BEGIN {
require 'Wx';
Wx->import( ':everything' );
};
该代码会将Wx中的':everything'导入当前命名空间。我的猜测是Wx使用Exporter并在使用':everything'调用时导入一组内容。
您可以查看Wx's source和Exporter's source以了解更多信息。
我错过了你的工作/非工作的例子。非工作状态不起作用,因为wxOK
和wxCENTRE
常量未导入当前命名空间。如上所述,这是使用Exporter完成的。
答案 1 :(得分:6)
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 );
为了将来参考,请包含错误消息,而不是简单地说某些内容不起作用。