【发布时间】:2018-07-27 05:50:20
【问题描述】:
在 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.
这表示STATE_1 中的$fsm{STATE_2}->(@_); 行未定义。事实上,在这条线第一次出现的时候,STATE_2 函数还没有定义,但我指望在运行时解决哈希查找。
如果我将$fsm{STATE_2}->(@_); 替换为my $tmp = STATE_2; $fsm{$tmp}->(@_);,那么它会按预期工作,这看起来很老套。
有没有更简洁的方法来做到这一点?
【问题讨论】:
-
use Const::Fast; const my $STATE_1 => 1;似乎合适?你也可以用它声明数组、哈希(以及它们的引用)。 -
也许吧,不过我想避免添加使分发复杂化的外部依赖项。
-
我认为你的状态应该是字符串。使用整数作为哈希键有点奇怪。只需删除
constant定义并引用州名即可。 -
是的,这绝对是我的 C 背景,希望我使用定义明确的常量作为标识符...
-
@John:字符串也是定义明确的常量。不同的是C没有哈希结构!