鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

PerlBeginners#14の予習(Mojo::IOLoop::Delay)

Mojo::IOLoop::Delayの使い方がよくわからなかったので実験。 5秒後に、"end"が表示され、そのあとBOOM!を表示します。 $delay->beginの返却値がコードブロックになっていて、 5秒後にそのコードレファレンスを呼ぶようにするのが味噌。

use Mojo::IOLoop::Delay;
  $|=1;
  my $delay = Mojo::IOLoop::Delay->new;
  $delay->steps(sub { print 'BOOM!' });
  my $end = $delay->begin;
  Mojo::IOLoop->timer(5 => sub {
      print "end";
      $end->();
  });
  $delay->wait;

上記コードだと分かりやすいんですが、下のように書くと, 若干戸惑うと思う。5秒後に$delay->beginが呼び出されるように 読めてしまうけど。$delay->beginは即時呼び出しされているんですね。

use Mojo::IOLoop::Delay;
  $|=1;
  my $delay = Mojo::IOLoop::Delay->new;
  $delay->steps(sub { print 'BOOM!' });
  Mojo::IOLoop->timer(5 => $delay->begin);
  $delay->wait;