非同期IOを実現するIO::Lambda
先日、CPAN Recent Changesをみていたら、IO::Lambdaなるモジュールを発見。ジャケ買い感覚でヲチしつつ、年始はこれを覚えてみようと思ったので、その記録。
とりあえず、やっとこさechoサーバとして動くようになった。
#!/usr/bin/env perl use strict; use warnings; use IO::Socket; use IO::Lambda qw/:all/; use IO::Lambda::Socket qw/:all/; my $server = IO::Socket::INET->new( Listen => 5, LocalPort => 10000, Blocking => 0, ReuseAddr => 1, ); die $! unless $server; my $serv = lambda { context $server; accept { my $conn = shift; print "[CONNECT]\n"; syswrite( $conn, "[CONNECT]\n" ); again; context getline, $conn, \( my $b ); tail { my ( $buf, $err ) = @_; if ( $err && $err eq 'eof' ) { print "[DISCONNECT]\n"; } elsif ($err) { print "[ERROR]\n"; syswrite( $conn, "[ERROR]" ); } else { #print "[INPUT] $buf"; syswrite( $conn, "[INPUT] $buf" ); again; } }}; }; $serv->wait;
今のところ、自分の中では、まだPOEとの差別化はできてない。シンタックスが違い過ぎるのでおもしれー、といったところ。