非同期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との差別化はできてない。シンタックスが違い過ぎるのでおもしれー、といったところ。