Perl 如何从其他包导入所有变量?
我有一个环球旅行包:Perl 如何从其他包导入所有变量?,perl,Perl,我有一个环球旅行包: package Constants; use strict; use warnings; use Exporter qw( import ); use Exporter (); use vars qw(@ISA @EXPORT_OK); @ISA = qw(Exporter); @EXPORT_OK = qw(@A %B, $C, foo); our %B = (id => 0, desc => "AF :: BUILD SUCCEE
package Constants;
use strict;
use warnings;
use Exporter qw( import );
use Exporter ();
use vars qw(@ISA @EXPORT_OK);
@ISA = qw(Exporter);
@EXPORT_OK = qw(@A %B, $C, foo);
our %B = (id => 0, desc => "AF :: BUILD SUCCEEDED");
our @A = (
"Undefined symbols for architecture",
"BUILD FAILED"
);
our $C = "blablabla";
sub foo(){}
1;
在其他Perl文件中,我可以将此包用作:
use FindBin qw($RealBin);
use lib $RealBin;
use Constants qw(@A %B, $C, foo);
它会起作用的
我想改变一下软件包的用法,如:
use Constants;
因此,从逻辑上讲,用法应该是:
Constants::@A; # I get an error
Constants::%B; # I get an error
Constants::$C; # I get an error
此方法适用于以下方法,例如:
Constants::foo(); # works!!
因此,如何使用@A%B$C
而不调用将它们链接到qw(@A%B$C)
?($
,@
或%
)中,在使用完全限定的变量名时需要首先考虑
@Constants::A;
%Constants::B;
$Constants::C;
本节的第一部分对此进行了解释
您可能已经在其他软件包中看到了这一点,例如,它允许您
在您的包中,您可以使用$C
,它只是有一个空名称空间,因此假定当前名称空间
$ foo # namespace is nothing
$Constants::foo # namespace is Constants::
它与函数一起工作(您显示的不是一个方法,因为不涉及OOP,方法调用将是常量->foo
),因为这些函数通常没有符号。您可以执行&常量::foo()
,它使用&
关闭任何原型,但请不要这样做,除非您知道自己在做什么
typeglobs还有一个sigil*
。同样的规则也适用于它
你问题的最后一句令人困惑 […]而不调用将它们链接到qw(@A%B$C) 我想你是说进口。当您将名称放入
@EXPORT\u OK
时,导出器允许您这样做。传递给use Constants
的名称列表告诉导出器应该将哪些符号安装到名称空间中
然后,它将类似于指针的东西放入命名空间,表示您的$C
引用了与$Constants::C
相同的内容
当您用<代码> > <代码> >代码>声明包变量时,请使用VARS(让我们把它们等同于这个答案的范围),它们总是可以从外部访问。您只需要使用完全限定的包名
将它们导入到您自己的名称空间只是一种方便。你也可以自己做use Constants (); # the empty list explicitly imports nothing
*C = \$Constants::C;
你只是做了你自己的进口。但是您可能不想这样做。($
,@
或%
)在使用完全限定的变量名时,需要先执行
@Constants::A;
%Constants::B;
$Constants::C;
package Constants;
use strict;
use warnings;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(@A %B $C foo); # always exports these to main::
our %B = (id => 0, desc => "AF :: BUILD SUCCEEDED");
our @A = (
"Undefined symbols for architecture",
"BUILD FAILED"
);
our $C = "blablabla";
sub foo(){}
1;
本节的第一部分对此进行了解释
您可能已经在其他软件包中看到了这一点,例如,它允许您
在您的包中,您可以使用$C
,它只是有一个空名称空间,因此假定当前名称空间
$ foo # namespace is nothing
$Constants::foo # namespace is Constants::
它与函数一起工作(您显示的不是一个方法,因为不涉及OOP,方法调用将是常量->foo
),因为这些函数通常没有符号。您可以执行&常量::foo()
,它使用&
关闭任何原型,但请不要这样做,除非您知道自己在做什么
typeglobs还有一个sigil*
。同样的规则也适用于它
你问题的最后一句令人困惑 […]而不调用将它们链接到qw(@A%B$C) 我想你是说进口。当您将名称放入
@EXPORT\u OK
时,导出器允许您这样做。传递给use Constants
的名称列表告诉导出器应该将哪些符号安装到名称空间中
然后,它将类似于指针的东西放入命名空间,表示您的$C
引用了与$Constants::C
相同的内容
当您用<代码> > <代码> >代码>声明包变量时,请使用VARS(让我们把它们等同于这个答案的范围),它们总是可以从外部访问。您只需要使用完全限定的包名
将它们导入到您自己的名称空间只是一种方便。你也可以自己做use Constants (); # the empty list explicitly imports nothing
*C = \$Constants::C;
你只是做了你自己的进口。但您可能不想这样做。请注意,获取
导入
方法的最新也是最好的方法是从导出器导入。这就是您对语句use Exporter qw(import)
所做的操作。老式的方法是使用Perl的继承机制,您还通过@ISA=qw(Exporter)
实现了这一点。您不应该同时使用这两种方法,因此@ISA
应保持为空。使用our
而不是use vars
可能更好,因此您可以使用our@EXPORT\u OK=qw(@A%B,$C,foo)
定义@EXPORT\u OK
,并删除use vars
语句。最后,无需加载导出器两次,因此您还可以删除use Exporter()
。这些措施将极大地整理您的代码。请注意,获取导入
方法的最新也是最好的方法是从导出器
导入。这就是您对语句use Exporter qw(import)
所做的操作。老式的方法是使用Perl的继承机制,您还通过@ISA=qw(Exporter)
实现了这一点。您不应该同时使用这两种方法,因此@ISA
应保持为空。使用our
而不是use vars
可能更好,因此您可以使用our@EXPORT\u OK=qw(@A%B,$C,foo)
定义@EXPORT\u OK
,并删除use vars
语句。最后,无需加载导出器两次,因此您还可以删除use Exporter()
。这些措施将极大地整理您的代码。
package Constants;
use strict;
use warnings;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(@A %B $C foo); # always exports these to main::
our %B = (id => 0, desc => "AF :: BUILD SUCCEEDED");
our @A = (
"Undefined symbols for architecture",
"BUILD FAILED"
);
our $C = "blablabla";
sub foo(){}
1;