我想在Perl中创建一个状态机.为此,我有一个由statenames索引的数组.我可以把subs放到这个数组中.像这样:
use constant {
stInit => 0,
stHeader => 1,
stSalesHeader => 2,
stCatagory => 3,
stData => 4,
stTotal => 5,
stError => 6,
};
my $state = stInit;
my @actions;
$actions[stInit] = [sub{logState("Initial state entered",2) }];
$actions[stHeader] = [sub{logState("Header state entered",2) }];
$actions[stSalesHeader] = [sub{logState("Sales header state entered",2) }];
$actions[stCatagory] = [sub{logState("Category state entered",2) }];
$actions[stData] = [sub{logState("Data state entered",2) }];
$actions[stTotal] = [sub{logState("Total state entered",2) }];
Run Code Online (Sandbox Code Playgroud)
但后来我不知道如何调用子程序.我试过这个
$actions[$state]
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.这可能还是完全关闭?
你真的应该补充一下
use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)
在你的代码的开头,你会发现许多简单的错误.在这种情况下,您的代码很好,您可以使用调用子例程
$actions[$state][0]();
Run Code Online (Sandbox Code Playgroud)
等等
但是没有必要将子例程放在方括号内,它只是创建一个单元素的匿名数组并添加一个额外的索引级别(因此[0]在上面的代码行中.如果您编写这样的代码而不是
$actions[stInit] = sub { logState("Initial state entered", 2) };
Run Code Online (Sandbox Code Playgroud)
然后你就可以调用子程序了
$actions[$state]();
Run Code Online (Sandbox Code Playgroud)