在我正在研究的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”。即在包中仅仅提及变量似乎将其添加到符号表中。
有没有办法在定义包时获取包的符号表,这样符号表只包含两个条目?
答案 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