我试图编写一个pragma来定义一堆常量,如下所示:
use many::constant
one_constant => 1,
other_constant => 2,
;
我导入的相关部分看起来像
package many::constant;
use strict;
use warnings;
sub import {
my ($class, @constants) = @_;
my $caller_nms = do {
no strict 'refs';
\%{caller.'::'}
};
while (my ($name, $value) = splice @constants, 0, 2) {
*{$caller_nms->{$name}} = sub () { $value };
}
}
我希望$caller_nms
存储在分配到这样的时候会自动生效,但我收到错误"不能使用未定义的值作为符号参考&#34 ;。有没有办法让这项任务像我期望的那样工作?我最终将作业更改为:
my $caller_glob = do {
no strict 'refs';
\*{caller.'::'.$name}
};
*$caller_glob = sub () { $value };
但这对我来说不那么优雅。
答案 0 :(得分:4)
只需使用use constant
作为基线并实际检查来源:constant.pm
。
这基本上也是它的作用:
my $pkg = caller;
# ...
{
no strict 'refs';
my $full_name = "${pkg}::$name";
# ...
my @list = @_;
*$full_name = sub () { @list };
}
另请注意,constant
模块具有以下功能:constant #Defining multiple constants at once
use strict;
use warnings;
use constant {
one_constant => 1,
other_constant => 2,
};
print one_constant, ' - ', other_constant, "\n";
输出:
1 - 2