我对Perl不太熟练,我正在尝试使用FSA :: Rules。这段代码的转变是什么?
my $fsa = FSA::Rules->new(
ping => {
do => sub {
print "ping!\n";
my $state = shift;
$state->result('pong');
$state->machine->{count}++;
},
rules => [
game_over => sub { shift->machine->{count} >= 20 },
pong => sub { shift->result eq 'pong' },
],
},
pong => {
do => sub { print "pong!\n" },
rules => [ ping => 1, ], # always goes back to ping
},
game_over => { do => sub { print "Game Over\n" } }
);
$fsa->start;
$fsa->switch until $fsa->at('game_over');
答案 0 :(得分:4)
默认情况下,shift会删除并返回@_数组的第一个元素。由于这是传递给子例程的参数数组,因此它获取第一个子例程参数。例如
sub { print shift; }
是一个匿名子程序,只消耗并打印其第一个参数。
答案 1 :(得分:3)
shift
命令正在访问每个子例程的下一个参数。
FSA::Rules->new
的参数是一个包含三个键的哈希:ping
,pong
和game_over
。我们来看ping
:它映射到包含两个键的另一个哈希:do
和rules
。 do
键映射到子例程:
sub {
print "ping!\n";
my $state = shift;
$state->result('pong');
$state->machine->{count}++;
}
此方法需要使用FSA::State
对象作为参数进行调用。其他子程序遵循类似的想法。请参考FSA::Rules docs了解如何使用这一切。
答案 2 :(得分:2)
Shift删除并返回数组的第一个元素。未指定数组时,假定为@_。该上下文中的@_是传递给子例程的参数列表。