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であってもあまり変わりませんが、どちらかを常に気をつけながら各必要がありますね。