perl常量定义在专用包中

hor*_*bzz 0 perl shared constants declaration package

我想为主perl程序和其他包设置所有常见声明的专用包,而不是在每个头中重复这些声明.我肯定错了,但无法弄清楚背后的理由:

我们假设:
- 我已经在包my_common_declarations.pm中设置了我的公共数据.
- 我想在另一个包中使用这些数据, 例如my_perl_utils.pm.

#!/usr/bin/perl -w
package my_perl_utils;
use parent qw(Exporter);
our @EXPORT_OK = qw(f1 f2);
use my_common_declarations qw(debugme);
my %setup = &debugme;
my $DEBUGME = $setup{setup}{debugme};

# This generates this error : "Use of uninitialized value"
use constant true => $setup{setup}{'true'};
print "=" x25, "\nDEBUG true :\nimport = " . $setup{setup}{'true'} . "\nconstant = " , true , "\n", "=" x25, "\n"; 

sub f1{
# some rationals using the true or false constants
}

sub f2{
}

1;  
Run Code Online (Sandbox Code Playgroud)

我无法成功地在没有错误的情况下声明'true'常量.

我应该在主程序中只导入一次公共声明包并在那里相应地声明常量,或者在我需要这个常量的每个包中重新声明它吗?

谢谢

Eri*_*rom 6

您遇到的问题是脚本中运行时和编译时之间的交互.任何use声明都有一个隐式BEGIN {...}块,这意味着它发生在编译时.%setup在声明常量之后,您的赋值将在运行时发生.对此的修复是声明变量,然后在BEGIN块中执行对它的赋值.这样,变量将由被use constant ...调用的时间定义:

use my_common_declarations 'debugme';

my (%setup, $DEBUGME);  # declare variables with file scope

BEGIN {
    %setup   = debugme;                # assign to variables at compile time
    $DEBUGME = $setup{setup}{debugme};
}

use constant true => $setup{setup}{true}; # %setup is defined now
Run Code Online (Sandbox Code Playgroud)

或者,由于您要导出一个返回哈希的函数,为什么不让它返回哈希引用,那么您可以将代码编写为:

use my_common_declarations 'debugme';

use constant true => debugme->{setup}{true};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,由于在编译时debugme由第一个use语句导入,因此它use constant ...在行中可用.

但是,既然你要声明一个通用声明的包,为什么不直接将常量的定义移动到该包中,然后添加类似于true该包的导出列表的东西?