是否可以在运行时内省标量的范围?
如果我有以下变量
my $a = 0;
my $*b = 1;
state $c = 2;
our $d = 3;
我可以很容易地确定这$*b是动态的,但$a不是下面的代码
say $a.VAR.dynamic;
say $*b.VAR.dynamic;
有什么方法可以类似地确定它$c是状态变量$d还是包范围的变量?(我知道我可以用will每个变量声明的特征来做到这一点,但我希望有一种不需要注释每个声明的方法。也许有 ::(...) 插值?)
回答
在包范围变量的情况下,不要太难:
our $foo = 'bar';
say $foo.VAR.name ? OUR::.keys
我们在哪里使用OUR伪包。但是,没有STATE伪包这样的东西。它们显然出现在LEXICAL伪包中,但我找不到检查它们是否是状态变量的方法。对不起。
回答
据我所知,没有办法识别state变量。像任何词法一样,它存在于 lexpad 中。唯一不同的是,它有效地生成了第一次进入范围时进行初始化的代码。