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

标签 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”。 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/

相关文章:

r - 对 R 包中的函数进行分组

perl - Dancer 与 Catalyst [Perl Web 框架]

perl - 编译旧的 Perl 发行版时如何使用 patchperl?

r - R中 "Error: package ' ____ _' was built before 3.0.0: please re-install it"的原因

Python ImportError - 包

php - 如何使用 yum 轻松地将 posix 支持添加到 PHP?

perl - 循环遍历文件行,如果文件不存在则抑制错误

arrays - 根据键(id)对perl数组数据结构中的键值对进行排序

Perl :what does "-" means in perl

r - 包装文档中的插图