質問 |
||
| 質問者:keeeeeeen | youtube api HASH(0x856eaec)の謎 | |
|---|---|---|
困り度:
|
googlenewsのapiにつづいてyoutubeのapiと格闘しています。 その際、TreePPモジュールを利用しているのですが、 どうしても解決できない問題があり、御相談させて下さい。 目標:youtubeのデータベースに人名で検索をかけ、その結果のリスト(XML)の中から、動画タイトルと動画IDを取り出す。 で、以下のプログラムで、動画IDは取り出せるのですが、動画タイトルの部分が HASH(0x856eaec) といた様な表示になってしまうのです。 ●どの様な状態の時に、HASH(0x856eaec)の様なものが表示されるのでしょうか(そもそも、これって何の値なんでしょうか?) ●動画タイトルを取り出すには、どの部分をどう修正すればいいのでしょうか? ●$ua->timeout(3);の部分で、タイムアウト処理をかましているつもりなのですが、どうも稼働している様には感じません。この様なプログラムの場合に、タイムアウト処理をかませるには、どうしたらよいのでしょうか? 以上3点、アドバイスいただければ幸です。 尚、当該xmlのタグ構造はコチラで確認していただけます。 http://gdata.youtube.com/feeds/api/videos?vq=aiko&start-index=1... 以下、そのプログラムです。 ------------------------------ #!/usr/local/bin/perl print <<"HTML"; Content-type: text/html <html> HTML # 動画スタートnoを乱数で決める srand; $startno = rand; $startno =( int($startno * 6))+1; # モジュールのロード use Jcode; use XML::TreePP; # 検索単語の設定 $searchword = "aiko"; use Encode; #検索キーワードをUTF-8コードに変換する Encode::from_to($searchword , 'sjis', 'utf8'); #URLエンコードを行う $searchword=~s/([^0-9A-Za-z_])/'%'.unpack('H2',$1)/ge; $searchword=~s/\s/+/g; use LWP::UserAgent; use HTTP::Request; my $url = 'http://gdata.youtube.com/feeds/api/videos?vq='.$searchword.'&st... # XML::TreePPオブジェクトの作成 my $tpp = XML::TreePP->new( force_array => [ "entry" ], ); # parsehttpメソッドでURLからXMLデータを取得して $tree変数に格納 my $tree = $tpp->parsehttp( GET => "$url" ); $ua = LWP::UserAgent->new(); $tpp->set( lwp_useragent => $ua ); $ua->timeout(3); # [rss] - [channel] - [item] を $Items変数に格納 my $Items = $tree->{feed}->{entry}; # 検索結果を表示 foreach my $hash (@$Items){ $urlyou=$hash->{id}; $titleyou=$hash->{title}; $idyou = substr($urlyou,42,11); print "$titleyou".$idyou."<BR>"; } |
|
質問投稿日時:08/03/15 15:14 質問番号:3864958 |
||
回答良回答20pt |
|
| 回答者:sakusaker7 | >$titleyouと同じ扱い方をしている$urlyouや$idyouも、同様に、HASH(0x856eaec) の様な形で出力されると思うのですが、 > これらに関しては、求めている値(URLやID)が出力されます。 > この違いは何なのでしょうか? これは元のXMLデータがどのようなフォーマットになっているのか、 また、それを XML::TreePP がどのように解析するかの問題でしょう。 ですから違いは何か、といわれても違うように扱われる何かがあるんでしょうねえとしか。 > -type:#text > この1行のみが表示されました。 ということは、 $titleyou=$hash->{title}; $hash->{title} からたどれるハッシュには '-type' と '#text' という 二つのキーがあるということですね。 '#text'の方に本体があるっぽいので、 $titleyou = $hash->{title}->{#text}; とすればタイトルの文章が取れそうな気がします。 '-type' の方は何かの説明でも入るんですかねえ。 こっちも $hash->{title}->{-type}; で内容が取れるはずなんで、一応チェックしてみてください。 |
|---|---|
| 種類:回答 どんな人:経験者 自信:参考意見 |
|
| |
回答日時:08/03/16 02:04 回答番号:No.2 |
|
| この回答へのお礼 | sakusaker7様へ 夜分に誠にありがとうございます。 >これは元のXMLデータがどのようなフォーマットになっているのか、 また、それを XML::TreePP がどのように解析するかの問題でしょう。 全く同じに取り扱っても、結果が全く違うフォーマットで出力されることがありうるのですね。XMLデータを見ると、どちらも単なる文字データとしか見えないので、TreePPの解析側に原因がありそうです。 >$hash->{title} からたどれるハッシュには '-type' と '#text' という >二つのキーがあるということですね。 -type:#textという1つのキーではなく、 '-type' と '#text' という2つのキーなのですね! (この点を勘違いしていました) >'#text'の方に本体があるっぽいので、 >$titleyou = $hash->{title}->{#text}; >とすればタイトルの文章が取れそうな気がします。 タイトルがとれました! ありがとうございます! >'-type' の方は何かの説明でも入るんですかねえ。 >こっちも >$hash->{title}->{-type}; >で内容が取れるはずなんで、一応チェックしてみてください。 チェックしてみたところ、全て text という文字が返ってきました。 文字データのタイプはtextですよ、という説明の様です。 ということは、文字タイプがtextという説明がある場合、TreePPは リファレンスを返す様にできている様です。 御陰で、今後、リファレンスの問題が起こった時、どうすればよいのかが分かりました(今まで、別のプログラムで、本筋と関係ないところで、偶然?同様の表示を目にしたことがありました)。 これで、 ●ハッシュ変数の謎 ●キーを取り出す方法 ●取り出されたキーの見方 ●キーから要素を取り出す方法 以上4点が分かりました。 これで前に進む事ができます。 この度は、丁寧に指導いただき、誠にありがとうございました! 心より感謝致します。 |
回答 |
|
| 回答者:sakusaker7 | >どの様な状態の時に、HASH(0x856eaec)の様なものが表示されるのでしょうか(そもそも、これって何の値なんでしょうか?) ハッシュリファレンスを通常の変数のように出力しようとしたときにそうなります。 ですので、その変数 $titleyou=$hash->{title}; ↑これですか? をさらにハッシュリファレンスであるとしてさらにデリファレンスしてやればよいです。 具体的にどういうハッシュなのかはわかりませんが、 とりあえず print join ':', keys %{$titleyou}; とかしてキーの一覧でもとってみれば見当がつくかもしれません。 #Data::Dumper などでダンプしてもいいですけど。 |
|---|---|
| 種類:回答 どんな人:経験者 自信:参考意見 |
|
| |
回答日時:08/03/15 16:04 回答番号:No.1 |
|
| この回答へのお礼 | sakusaker7様 早速のアドバイス、ありがとうございます。 ハッシュリファレンスについて、あれこれ調べて、いろいろ試したのですが、なかなかうまくいきません、、、。 >ハッシュリファレンスを通常の変数のように出力しようとしたときにそうなります。 なるほど。そういうことですか! が、ここで1つ疑問が。 であれば、$titleyouと同じ扱い方をしている$urlyouや$idyouも、同様に、HASH(0x856eaec) の様な形で出力されると思うのですが、これらに関しては、求めている値(URLやID)が出力されます。 この違いは何なのでしょうか? >print join ':', keys %{$titleyou}; >とかしてキーの一覧でもとってみれば見当がつくかもしれません。 上記のプログラムの最後に、この一行を入れて表示させてみたところ、、、 -type:#text この1行のみが表示されました。 ここで行き詰まっています。 引き続きアドバイスいただければ幸です。 |