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'常量.
我应该在主程序中只导入一次公共声明包并在那里相应地声明常量,或者在我需要这个常量的每个包中重新声明它吗?
谢谢
您遇到的问题是脚本中运行时和编译时之间的交互.任何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该包的导出列表的东西?
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |