如何直接插入藏匿处?

时间:2014-05-05 20:16:28

标签: perl metaprogramming

我试图编写一个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 };

但这对我来说不那么优雅。

1 个答案:

答案 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