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.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行のみが表示されました。
ここで行き詰まっています。
引き続きアドバイスいただければ幸です。
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点が分かりました。
これで前に進む事ができます。
この度は、丁寧に指導いただき、誠にありがとうございました!
心より感謝致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- JavaScript WordPressのコンタクトフォーム7にて送信者の位置情報を送らせたい 2 2022/09/14 23:28
- YouTube youtubeからの著作権メールについて 2 2023/02/14 16:12
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- HTML・CSS スクロールすると追従する画像のコードを書いているのですが、追従する画像の大きさの調節が上手くいきませ 2 2022/04/18 12:52
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列を変数名として扱う方法
-
ハッシュ検索はなぜ速い
-
*(アスタリスク)の意味
-
チェックデジットについて
-
ハッシュ値によるファイルの同...
-
python の素朴な疑問
-
ハッシュマーク以降のアドレス取得
-
プログラミングについて。 1つ...
-
どなたかこのプログラミングを...
-
ネットワークループとルーティ...
-
perlでファイルの拡張子を除い...
-
VBAでの一時停止と再開の方法
-
画面を強制的に再描画させる方法
-
二次元配列のインデックスについて
-
イベントの発生を待つ
-
UWSCの終了の仕方
-
Strawberry Perl for Windows ...
-
多重ループの抜けだし方
-
Perlで<select multiple>の複数...
-
【VBA】指定の範囲から特定の文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
チェックデジットについて
-
列挙型と連想配列の違いを教え...
-
まったく同じファイルのハッシ...
-
ハッシュ値が一致したデータは...
-
英語でのシャープとコメの呼び...
-
ハッシュのハッシュを実現したい。
-
データベースでユーザーのパス...
-
UTF-8で書かれたJSPの日本語文...
-
Perlは戻り値で、ハッシュや配...
-
perlで配列名を動的に作り出したい
-
ハッシュリストって単にハッシ...
-
短いハッシュの作り方
-
重複ファイルを削除したいので...
-
*(アスタリスク)の意味
-
連想配列のサイズ制限
-
python の素朴な疑問
-
多次元配列から重複を削除
-
一意(ユニーク)かつ、ソート...
おすすめ情報