Perl调用存在于数组中的子例程

Dan*_*ley 2 perl

我想在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)

但这似乎不起作用.这可能还是完全关闭?

Bor*_*din 9

你真的应该补充一下

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)

  • 确实.`&`唯一的非深奥用法是使用`\&mysub`访问子程序的引用.这种方式多年来一直如此. (4认同)