2

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

工作线:

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.
4

2 回答 2

13

它相当于:

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

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

您可以检查Wx 的源代码Exporter 的源代码以尝试更了解它。

我错过了您的工作/非工作示例。不工作的那个不起作用,因为wxOKandwxCENTRE常量没有导入到当前命名空间中。如上所述,这是使用 Exporter 完成的。

于 2011-10-17T14:25:46.437 回答
6
qw(:everything)

非常相似

(split ' ', ':everything')

所以

use Wx qw(:everything);

是相同的

use Wx ':everything';

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

wxOK除非您要求,否则 Wx 似乎不会导出任何内容,因此wxCENTRE除非您告诉 Wx 使用

use Wx qw( wxOK wxCENTRE );

或者

use Wx qw( :everything );

以供将来参考,请包括错误消息等,而不是简单地说某事不起作用。

于 2011-10-17T14:57:07.257 回答