■2010-04-22
* [Perl][メモ] perl-casual #02のライブコーディングで気づいた点
昨日のperl-casual #02でlestrratさんがtwitter apiからデータを取得するプログラムのライブコーディングをされました。その中で、全然本質的じゃないところなのですが、一点気づいたことがあるので補足を。
LWPを使ってTwitter APIを叩き、JSONデータを展開する部分で:
# $responseはHTTP::Responseのオブジェクト decode_json( $response->decoded_content );
というコード。昨日はちゃんと動作していましたが、場合によっては"Wide character in subroutine entry"でcroakします。これは、$response->decoded_content
が返す値がUnicodeだからです。
ではなぜ昨日は大丈夫だったかというと、Twitter APIが返したJSONデータは文字列が\uでエスケープされていました。つまり、$response->decoded_content
の返値はUnicode文字列ではあるものの実質asciiだけで構成されています。こういう場合はdecode_jsonもcroakしません。ですから、上記の部分は
decode_json( $response->content ); # 生のutf-8データ
とした方が安全です。decoded_contentが使いたい場合は
JSON->new->utf8(0)->decode( $response->decoded_content );
などのようにすると良いでしょう。decode_json
の動作については、私の先日の記事なども。
本当のスクリプトは decode_json $response->content なんだけど、そっちなら大丈夫・・・なはずですよね? <br> <br>昨日は勢いで SYNOPSISコピペしちゃって説明するの面倒だったw
昨日はお疲れ様でした〜 <br> <br>はい、それで大丈夫です!> decode_json $response->content <br> <br>