如何在定义包时获取包中的符号?

时间:2017-10-19 12:06:10

标签: perl package

在我正在研究的Perl程序中,用户可以指定要加载的Perl模块,该模块应该定义一对(可变数量)变量。然后Perl程序处理这些变量,基本上将包视为普通哈希,除了值都在命名空间中。这样做很好,即这个程序打印'2':

use strict;
use warnings;

package P {
    my $k1 = 'v1';
    my $k2 = 'v2';
};

my $n = scalar keys %P::;
print "Number of entries: $n\n";
# print $P::x;

然而,取消注释最后一行会使程序打印为“3”。即在包中仅仅提及变量似乎将其添加到符号表中。

有没有办法在定义包时获取包的符号表,这样符号表只包含两个条目?

1 个答案:

答案 0 :(得分:5)

编译时遇到的包变量将在编译时添加到存储。因此,您的解决方法是在编译阶段评估存储

package P {
    $k1 = 'v1';
    $k2 = 'v2';
};

BEGIN {    
    my $n = scalar keys %P::;
    print "Number of entries: $n\n";  # 2
}
print $P::x;

或在运行时定义其他包变量

package P {
    $k1 = 'v1';
    $k2 = 'v2';
};

my $n = scalar keys %P::;
print "Number of entries: $n\n";    # 2
print eval '$P::x';
$n = scalar keys %P::;
print "Number of entries: $n\n";    # now 3