如何从其他包导入所有变量?

时间:2017-01-08 09:17:03

标签: perl

我有包含全局变量的包:

),   KEY

在其他Perl文件中我可以将此包用作:

(

它会起作用。

我想改变一下包的用法,如:

) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

逻辑上,用法应该是:

app.config(['$httpProvider',
  function ($httpProvider) {

    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}

此方法适用于方法,例如:

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;

那么我如何使用use FindBin qw($RealBin); use lib $RealBin; use Constants qw(@A %B, $C, foo); 而无需将其链接到use Constants;

2 个答案:

答案 0 :(得分:4)

使用完全限定的变量名称时,

The sigil$@%)需要先行。

@Constants::A; 
%Constants::B; 
$Constants::C; 

perlsyn的第一部分对此进行了解释。

您可能已经在Data::Dumper之类的其他软件包中看到了这一点,它允许您to configure it with its package variables

use Data::Dumper;
$Data::Dumper::Indent = 0;

在你的包中你可以使用$C,它只是一个空的命名空间,所以假设当前的那个。

$           foo  # namespace is nothing
$Constants::foo  # namespace is Constants::

它适用于函数(你显示的不是一个方法,因为没有涉及OOP,方法调用将是Constants->foo),因为那些通常没有sigil。您可以&Constants::foo()使用&关闭任何原型,但除非您知道自己在做什么,否则请不要这样做。

还有一个用于typeglobs的sigil *。同样的规则适用于它。

你问题的最后一句话令人困惑。

  

[...]没有调用链接到qw(@A%B $ C)?

我认为你的意思是导入它们。这就是当您将名称放入@EXPORT_OK时,Exporter允许您执行的操作。传递给use Constants的名称列表告诉Exporter它应该在命名空间中安装哪些符号。

然后将类似指针的内容放入您的命名空间,表明您的$C$Constants::C引用的内容相同。

当您使用ouruse vars声明包变量时(让我们认为它们与此答案的范围相同),它们始终可以从外部访问。您只需要使用完全限定的包名称。

将它们导入您自己的命名空间只是一种方便。你也可以自己做。

use Constants (); # the empty list explicitly imports nothing
*C = \$Constants::C;

你刚刚自己导入了。但你可能不想这样做。

答案 1 :(得分:-2)

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;