Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何从其他包导入所有变量?_Perl - Fatal编程技术网

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;