在此示例中,shift命令用于FSA :: Rules的Perl代码是什么?

时间:2012-01-31 03:31:37

标签: perl

我对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');

3 个答案:

答案 0 :(得分:4)

默认情况下,shift会删除并返回@_数组的第一个元素。由于这是传递给子例程的参数数组,因此它获取第一个子例程参数。例如

sub { print shift; }

是一个匿名子程序,只消耗并打印其第一个参数。

答案 1 :(得分:3)

shift命令正在访问每个子例程的下一个参数。

FSA::Rules->new的参数是一个包含三个键的哈希:pingponggame_over。我们来看ping:它映射到包含两个键的另一个哈希:dorulesdo键映射到子例程:

sub {
    print "ping!\n";
    my $state = shift;
    $state->result('pong');
    $state->machine->{count}++;
}

此方法需要使用FSA::State对象作为参数进行调用。其他子程序遵循类似的想法。请参考FSA::Rules docs了解如何使用这一切。

答案 2 :(得分:2)

Shift删除并返回数组的第一个元素。未指定数组时,假定为@_。该上下文中的@_是传递给子例程的参数列表。