在 Perl 5.26 中,基于常量的哈希查找似乎是在编译时解决的,而不是运行时解决的。如何强制它在运行时解决?
考虑以下简化的测试用例,从我试图编写的基于散列的状态机中总结出来,其中键是状态标识符,值是状态函数。
use constant {
STATE_1 => 1,
STATE_2 => 2,
};
my %fsm;
%fsm = (
STATE_1, sub {
$fsm{STATE_2}->(@_);
return STATE_2;
},
STATE_2, sub {
return STATE_1;
}
);
my $state = STATE_1;
$state = $fsm{$state}->();
请注意,在 中STATE_1
,我正在尝试调用该STATE_2
函数。
但是,在运行时我得到这个:
Can't use an undefined value as a subroutine reference at ./self-reference-hash.pl line 15.
这表明该$fsm{STATE_2}->(@_);
行STATE_1
未定义。事实上,在这条线第一次出现的时候,这个STATE_2
函数还没有定义,但我指望哈希查找在运行时被解析。
如果我改为替换$fsm{STATE_2}->(@_);
为my $tmp = STATE_2; $fsm{$tmp}->(@_);
then 它会按预期工作,这似乎很hacky。
有没有更清洁的方法来做到这一点?