qw(:everything)在perl中的使用行上做了什么?

时间:2011-10-17 14:21:38

标签: perl wxwidgets wxperl

这是一个令人尴尬的问题,但是为什么这条线有效而另一条没有呢?

工作线:

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 个答案:

答案 0 :(得分:13)

它相当于:

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

该代码会将Wx中的':everything'导入当前命名空间。我的猜测是Wx使用Exporter并在使用':everything'调用时导入一组内容。

您可以查看Wx's sourceExporter's source以了解更多信息。

我错过了你的工作/非工作的例子。非工作状态不起作用,因为wxOKwxCENTRE常量未导入当前命名空间。如上所述,这是使用Exporter完成的。

答案 1 :(得分:6)

qw(:everything)

非常相似
(split ' ', ':everything')

所以

use Wx qw(:everything);

相同
use Wx ':everything';

字符串:everything被传递给Wx的导出例程(import)。语义完全取决于模块,但我假设Wx将其定义为“导出我可能导出的所有内容”。大多数模块都使用:ALL,如果他们提供它的话。

看起来除非你问,Wx不会导出任何内容,所以你的命名空间中不存在wxOKwxCENTRE,除非你告诉Wx使用

导出它们
use Wx qw( wxOK wxCENTRE );

use Wx qw( :everything );

为了将来参考,请包含错误消息,而不是简单地说某些内容不起作用。