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=aik …
以下、そのプログラムです。
------------------------------
#!/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='.$ …
# 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>";
}
No.2ベストアンサー
- 回答日時:
>$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};
で内容が取れるはずなんで、一応チェックしてみてください。
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点が分かりました。
これで前に進む事ができます。
この度は、丁寧に指導いただき、誠にありがとうございました!
心より感謝致します。
No.1
- 回答日時:
>どの様な状態の時に、HASH(0x856eaec)の様なものが表示されるのでしょうか(そもそも、これって何の値なんでしょうか?)
ハッシュリファレンスを通常の変数のように出力しようとしたときにそうなります。
ですので、その変数
$titleyou=$hash->{title};
↑これですか? をさらにハッシュリファレンスであるとしてさらにデリファレンスしてやればよいです。
具体的にどういうハッシュなのかはわかりませんが、
とりあえず
print join ':', keys %{$titleyou};
とかしてキーの一覧でもとってみれば見当がつくかもしれません。
#Data::Dumper などでダンプしてもいいですけど。
sakusaker7様
早速のアドバイス、ありがとうございます。
ハッシュリファレンスについて、あれこれ調べて、いろいろ試したのですが、なかなかうまくいきません、、、。
>ハッシュリファレンスを通常の変数のように出力しようとしたときにそうなります。
なるほど。そういうことですか!
が、ここで1つ疑問が。
であれば、$titleyouと同じ扱い方をしている$urlyouや$idyouも、同様に、HASH(0x856eaec) の様な形で出力されると思うのですが、これらに関しては、求めている値(URLやID)が出力されます。
この違いは何なのでしょうか?
>print join ':', keys %{$titleyou};
>とかしてキーの一覧でもとってみれば見当がつくかもしれません。
上記のプログラムの最後に、この一行を入れて表示させてみたところ、、、
-type:#text
この1行のみが表示されました。
ここで行き詰まっています。
引き続きアドバイスいただければ幸です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
Perlでファイルを読み込み...
-
連想配列(ハッシュ)のファイ...
-
ハッシュ法について
-
英語でのシャープとコメの呼び...
-
Perlは戻り値で、ハッシュや配...
-
レコードセットを配列のハッシ...
-
チェックデジットについて
-
オープンハッシュ法とチェイン...
-
*(アスタリスク)の意味
-
ハッシュのハッシュを実現したい。
-
文字列を変数名として扱う方法
-
UWSCの終了の仕方
-
VBのReturnの使い方
-
Escキーを押すと、中断する時と...
-
grepを利用して、特定の要素が...
-
VBA Dir関数でファイルをループ...
-
DoEventsが必要な理由について
-
アクティブセルから、A列最終行...
-
vb.netからエクセル関数書き込み
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字列を変数名として扱う方法
-
ハッシュ検索はなぜ速い
-
チェックデジットについて
-
perl 文字列検索後に指定フィー...
-
perlで配列名を動的に作り出したい
-
列挙型と連想配列の違いを教え...
-
英語でのシャープとコメの呼び...
-
ハッシュのハッシュを実現したい。
-
動的なハッシュの配列を作成したい
-
多次元連想配列の削除
-
多次元配列から重複を削除
-
ハッシュリストって単にハッシ...
-
ハッシュ値が一致したデータは...
-
まったく同じファイルのハッシ...
-
*(アスタリスク)の意味
-
ハッシュマーク以降のアドレス取得
-
Perlのサブルーチンの引数に配...
-
UTF-8で書かれたJSPの日本語文...
-
連想配列のサイズ制限
-
Perlは戻り値で、ハッシュや配...
おすすめ情報