在我正在处理的 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”。 IE。包中变量的纯粹提及似乎将其添加到符号表中。
有没有办法获取定义的包的符号表,使符号表仅包含两个条目?
最佳答案
在编译时遇到的包变量将在编译时添加到存储中。因此,您的解决方法是在编译阶段评估存储
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
关于perl - 如何在定义包时获取包中的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46829456/