Что делает команда shift в этом примере для perl-кода для FSA :: Rules? - PullRequest
1 голос
/ 31 января 2012

Я не очень опытен в 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 ]

4 голосов
/ 31 января 2012

По умолчанию shift удаляет и возвращает первый элемент массива @_. Поскольку это массив параметров, который передается подпрограммам, он получает первый аргумент подпрограммы. Например

sub { print shift; }

- это анонимная подпрограмма, которая просто потребляет и печатает свой первый аргумент.

3 голосов
/ 31 января 2012

Команда 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 голосов
/ 31 января 2012

Shift удаляет и возвращает первый элемент массива.Когда массив не указан, предполагается @_.@_ в этом контексте - список аргументов, переданных подпрограмме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...