AnyEventのサンプルその2

AnyEvent::Handleを使って対話するサーバを書く

サーバを立ち上げてtelnetでアクセスすると名前を聞かれるので答える。次に年齢まで聞いてくるので答えます。それで対話が終了しサーバの方から接続を切ってきます。味噌はIO監視の中でさらに監視をしているというところなのだが、本当に問題のない書き方なのかが少し心配。。

use strict;
use warnings;
use AnyEvent;
use AnyEvent::Strict;
use AnyEvent::Handle;
use AnyEvent::Socket;

$|++;
my $cv = AE::cv;
tcp_server '127.0.0.1', 8888, sub {
    my ($fh) = @_ or die;

    my $handle;
    $handle = AnyEvent::Handle->new(
        fh       => $fh,
        on_error => sub { },
        on_eof   => sub { },
        on_read  => sub { print "now on_read\n"; }
    );
    $handle->push_write("Enter Your Name: ");

    my $w;
    $w = AnyEvent->io(
        fh   => $fh,
        poll => 'r',
        cb   => sub {
            my ( $name, $age );
            $handle->push_read(
                line => sub {
                    my ( $handle, $line ) = @_;
                    $name = $line;
                }
            );
            $handle->push_write("Your Name is $name\015\012");

            $handle->push_write("How old r u ?: ");
            my $w2;
            $w2 = AnyEvent->io(
                fh   => $fh,
                poll => 'r',
                cb   => sub {
                    $handle->push_read(
                        line => sub {
                            my ( $handle, $line ) = @_;
                            $age = $line;
                        }
                    );
                    $handle->push_write("You are $age years old\015\012");
                    $handle->push_write("個人情報は頂いた!! \015\012");
                    undef $w2;
                },
            );    
            undef $w;
        },
    );
};
$cv->recv;