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

slm*_*slm 2 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
);
Run Code Online (Sandbox Code Playgroud)

非工作线:

use strict;
use warning;
use Wx;
my $dialog = Wx::MessageDialog->new(
   $self,
   "About test\n" .  "Version 0.01\n",
   "About Test",
   wxOK | wxCENTRE
);
Run Code Online (Sandbox Code Playgroud)

来自非工作行的错误消息:

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.
Run Code Online (Sandbox Code Playgroud)

gpo*_*ojd 13

它相当于:

BEGIN {
    require 'Wx';
    Wx->import( ':everything' );
};
Run Code Online (Sandbox Code Playgroud)

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

您可以查看Wx的来源Exporter的来源,以便更好地了解它.

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


ike*_*ami 6

qw(:everything)
Run Code Online (Sandbox Code Playgroud)

非常相似

(split ' ', ':everything')
Run Code Online (Sandbox Code Playgroud)

所以

use Wx qw(:everything);
Run Code Online (Sandbox Code Playgroud)

是相同的

use Wx ':everything';
Run Code Online (Sandbox Code Playgroud)

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

看起来,除非你问蜡质没有出口任何东西,所以wxOKwxCENTRE除非你告诉蜡质使用导出他们不要在你的命名空间中

use Wx qw( wxOK wxCENTRE );
Run Code Online (Sandbox Code Playgroud)

要么

use Wx qw( :everything );
Run Code Online (Sandbox Code Playgroud)

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