メメメモモ

プログラミング、筋トレ、ゲーム、etc

AnyEvent::IRCを試す2

http://d.hatena.ne.jp/memememomo/20100416/1271371693

    irc_privmsg => sub {
        my ( $self, $msg ) = @_;
        my $comment = $msg->{params}->[-1];
        my $trans_url = 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=' . uri_escape($comment).'&langpair=en%7Cja';
        my $json = LWP::Simple::get($trans_url);
        my $result = from_json($json);
        print
            "\n" .
            Encode::encode('utf8',$result->{responseData}->{translatedText}) . "\n" .
            '('.Encode::encode('utf8',$comment).')' . "\n";
    },

このエントリで指摘があった通り、LWP::Simple::getでblockingされています。


LWP::Simple::getの代わりにAnyEvent::HTTPで書き直しました。
AnyEvent::HTTPでは、下記のような形になります。

my $guard; $guard = http_get 'http://hogehoge.net' => sub {
    my ($body, $headers) = @_;
    undef $guard;
};


最終的に、下記のようになりました。

irc_privmsg => sub {
       my ( $self, $msg ) = @_;
       my $comment = $msg->{params}->[-1];
       my $trans_url = 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=' . uri_escape($comment).'&langpair=en%7Cja';
       my $guard; $guard = http_get $trans_url => sub {
            my ($body, $headers) = @_;
            undef $guard;
            my $result = from_json($bodyn);
            print
                    "\n".
                    $result->{responseData}->{translatedText} . "\n".
                    '('.$comment.')'."\n";
            };
},


LWP::Simple::getと違い、$bodyはEncodeされたものが渡ってきているみたいでしたので、
Encode::encodeをやらないようにしました。


この場合、blockingであってもnon-blockingであってもあまり変わりませんが、どちらかを常に気をつけながら各必要がありますね。