• ベストアンサー

ハッシュ変数の怪

お世話になります。 ハッシュ変数の扱い方について教えて下さい。 <最終的にヤリタイコト> ブログのRSSを読み込み、そのブログ自体のタイトル(1つ)を表示するプログラムを作成したい。 その為に、以下の様なプログラムを作成しています。 ------------------------------------ # 頻繁にRSSを読みに行くのを避けるため、 一時的に$blogfileにRSSファイルを保存しています。 $blogfile="./save/blog.rss"; use XML::RSS; use LWP::Simple; # 保存しているRSSデータを解析 $rss = new XML::RSS; $rss->parsefile($blogfile); # サイト情報を取得 $bigtitle = $rss->{channel}; # そして、これにつづけて、 print $bigtitle->{title}; とすると、ブログ名がキチンと印刷されます。 しかし、この場ではブログ名を表示させたくはなく、一旦、スカラー変数に、このブログ名を代入しておき、後になってから、スカラー変数に代入されたブログ名をprint文で表示させたいのです。 この場合、例えば、 print $bigtitle->{title}; の代わりに $blogtitle=$bigtitle->{title}; とやっても、$blogtitleにブログ名は代入されません。 また、$blogtitleをprint文で表示させてみると、 HASH(0x8ddb5d4) と、いつかどこかで見たような表示になってしまいます。 ●ブログ名をスカラー変数に代入する方法をご教授、よろしくお願い致します。(または、上記の方法以外で、とてもカンタンにブログのRSS情報を元に、そのブログ自体のタイトルのみをスカラー変数に代入するperlプログラムがありましたら、教えて下さい) よろしくお願い致します。

  • Perl
  • 回答数2
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • pick52
  • ベストアンサー率35% (166/466)
回答No.1

$blogtitle=$bigtitle->{title}; で代入されませんか。 その場合、代入先の変数宣言が間違っているとかありませんか。 myの場合、宣言しているブロックの外ではアクセスできません。 因みに HASH(0x8ddb5d4) のようにでるのはこの変数はハッシュへのリファレンスであることを 指しています。 リファレンスというのはCなどにおけるポインタに非常によく似ている ものです。 (正確には微妙に異なりますけど) リファレンス自体はスカラー値です。

参考URL:
http://kabocha.org/jelfe/07/19.html
keeeeeeen
質問者

お礼

pick52様へ お返事、ありがとうございます。 >$blogtitle=$bigtitle->{title}; で代入されませんか。 はい。代入されないんです。 なのに、 print $bigtitle->{title}; とやると、ちゃんと、中身が表示されるんです。 で、 print $bigtitle; とやると HASH(0x8ddb5d4) と表示されてしまいます。 で、参考URLありがとうございます。 まずは、こちらをじっくりと読んでみます。 教えてくださり、ありがとうございます!

その他の回答 (1)

  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.2

変数の構造が知りたいときは、Dumperを使うと便利です。 ActivePerlなら、ppm を使って install Data::Dumper をしてください。 use Data::Dumper; print Data::Dumper->new( [$bigtitle] )->Indent(1)->Sortkeys(1)->Dump;

keeeeeeen
質問者

お礼

atom_seed様へ 教えていだだきありがとうございます。 >install Data::Dumper をしてください。 その様なやり方があるのですね。 早速、やってみます。 で、今まで、フツーに、ブログの中の記事タイトル&記事要約一覧は スカラー変数に代入できてたので、それと同じやり方で、 そのブログ自体のタイトルを取得しスカラー変数に代入する方法で とりあえずしのぐことにしました。 具体的には、、、 # XML::TreePPオブジェクトの作成 my $tpp = XML::TreePP->new( force_array => [ "channel" ], ); # parsefileメソッドで$blogfileからXMLデータを取得して $tree変数に格納 my $tree = $tpp->parsefile($blogfile); # [rss] - [channel}] - を $Items変数に格納 $Items = $tree->{rss}->{channel}; foreach my $hash (@$Items){ $bigtitle =$hash->{title}; Encode::from_to($bigtitle,'utf8','sjis'); } これで$bigtitleに、ブログ自体のタイトルを代入することができたのですが、ブログ自体のタイトル情報たった1つを入手するのに、ここまで大袈裟なことしなくてすむと思い、あれこれやってみたのですが、下記の様な現象が起きるので御相談させていただきました。 (とりあえずは上記の冗長なプログラムを走らせておきます(^_^;))

関連するQ&A

  • XML内のタグの内容を、変数に出来ますか?

    こんにちは。 はじめに、FlashやXMLに関しての知識はあまり無い為、分かりづらい点があるかもしれませんが、その点は出来る限り補足します。 自分のブログのタイトルとリンクを取り出し、ホームページ上に表示させる1行ティッカーを作りたいと思っています。 ブログとホームページは違うドメインなので、PHPでRSSを呼び出し、PHPをflashに読み込む事に成功しました。(traceで確認しました) (このような感じになります) RSS>>>[PHP>>>SWF]←ホームページのサーバー そして、読み込んだRSSの中にある「タイトル、記事URL」の部分をそれぞれ変数に代入して表示させたいのですが、RSS(XML)の中から、あるタグの内容だけを取り出し、変数にする事は可能でしょうか? 回答、アドバイスよろしくお願いします。 (XMLを誤解している、こうした方が早い、というような回答も待っています。)

  • XML::RSS文字コード統一の仕方がわかりません

    perl初心者です。 rssを取得して簡易ブログパーツをつくりたいのですが文字コードでうまいこといかず悪戦しています。 以下がコードです。(きたなくてすいません…) #!/usr/bin/perl use LWP::Simple; use XML::RSS; use utf8; use open ":utf8"; $logfile="./syoukai.log"; open(DAT, "$logfile"); @log=<DAT>; close(DAT); my $rss = new XML::RSS; @list = (); foreach(@log){ ($nom,$name,$prof,$xml,$btitle,$ktitle,$klink)=split(/<>/); eval { $rss->parse( LWP::Simple::get($xml) ); }; if($@) { next; } $btitle = $rss->{'channel'}->{'title'}; $prof = $rss->{'channel'}->{'link'}; $item = $rss->{'items'}; $line = @{$item}[0]; $ktitle = $line->{'title'}; $klink = $line->{'link'}; $date = $line->{'pubDate'}; push(@list, "$date<>$name<>$prof<>$xml<>$btitle<>$ktitle<>$klink<>\n"); } open(IN,">$logfile"); print IN @list; close(IN); exit; syoukai.logを呼び出して そこに書かれたxmlを順番に読み込んで ファイルを更新したいのですが これだと何もいじっていない$nameは大丈夫なんですが $btitleや$ktitleが文字化けしてファイルに書かれてしまいます…。 use utf8;ではなく use encoding 'UTF-8', STDOUT => 'cp932';としたら 今度は$nameだけ文字化けしてしまいます。 別々の文字コードを一緒にしてしまってるからだと思うのですが どれがどの文字コードなのかがわからないでいます。 文字コードを統一する方法などがあれば教えてくださいm(__)m 説明&記述ヘタですいません…。 宜しくお願いします。

  • 変数名を配列として利用するには?

    複数のモジュールに記述されている配列を1つの配列へ代入したいと思っています。 単純に考えれば、 @array = (@Module1::array, @Module2::array, @Module3::array); で良いのですが、モジュールが多岐に渡っており、モジュール名自体はスカラー変数へ代入して置き、それを利用したいと考えています。 @array = (); foreach $m (qw(Module1 Module2 Module3)) { $mn = $m. '::array'; foreach $w (@{$mn}) { # @Module1::array にアクセスしているつもり push(@array, $w); } } この様なイメージです。 しかし、@{$mn}は Can't use string ("変数名") as an ARRAY ref while "strict refs" in use at 行番号. になってしまいます。 スカラー文字列に入っている配列変数へアクセスするにはどう記述すれば良いでしょうか?

    • ベストアンサー
    • Perl
  • foreachで一致した説明文を表示(初心

    この間ポケモン図鑑について質問させていただいた者です。(ID違いますけど^^; http://oshiete1.goo.ne.jp/kotaeru.php3?q=1649007 変な質問をしてるかもしれませんm(_ _)m @list内には 手持ち・・(略)<>あくしゅう<> ほのお・こお・・<>あついしぼう<> 戦頭に出ると・・<>あめふらし<> このように1つ目に説明文、2つ目に(特性の)名前が入っています。 それを、 foreach(@list){ ($content,$name)=split(/<>/); } こんな感じでスカラー変数に代入してるのですが、 各ポケモンのデータを表示するページで説明文を表示するにはどうすればいいのでしょうか? 「$end_tokuse」というスカラー変数にあらかじめ各ポケモンの特性の名前は入っていて、それを上の処理と一致するか、しないかでこんな感じで print <<EOM; <table><tr><td> EOM ここに上の処理を print <<EOM; </td></tr></table> EOM 持って来て表示させようかと思っていたのですが、表示するデータの量がほかにもたくさんありすぎていちいち切っていると 編集が大変面倒になるので、一致した説明文をスカラー変数に代入して print <<EOM; <table><tr><td> $setume </td></tr></table> EOM このようにしたいのですが、どうすればいいかわかりません。 一致した説明文をスカラー変数に代入して表示させるにはどうすればいいですか。 わかりにくいですがよろしくお願いします。

    • ベストアンサー
    • Perl
  • PerlでRSS取得 ~ 文字化け ~ utf8→ShifJIS変換できない

    XML::RSSを使用してRSSのタイトルを取得するPerlスクリプトを作っています。 DBCSの場合、文字化けするので、以下のようにfrom_toを使用してutf8をShiftJISに変換しようとしましたが、エラーが出ます。 SBCSでは問題無いのですが。 Encode::Guessで調べるとutf8が返ってくるので、「from_to( $title, 'utf8','shiftjis' )」でutf8をShift-JISに変換すればよいのかと思ったのですが。 ■環境 ・perl v5.8.3 built for MSWin32-x86-multi-thread ・Windows2000(SP4) ■エラーメッセージ Cannot decode string with wide characters at c:/Perl/lib/Encode.pm line 184. ■ソース #!/usr/bin/perl BEGIN { use CGI::Carp qw(carpout fatalsToBrowser); carpout(STDOUT); } use Encode qw/ from_to /; use LWP::Simple 'get'; use XML::RSS ; print"Content-type: text/html\n\n"; print"<HTML>\n"; print"<HEAD><meta http-equiv=\"Content-Type\" content=\"text/html;charset=Shift-JIS\"></HEAD>\n"; print"<BODY>\n"; my $rss = new XML::RSS; eval {   # $rss->parse( get('http://slashdot.org/slashdot.rdf') );    $rss->parse( get('http://oshiete1.goo.ne.jp/rss/oshiete_goo.xml') ); }; exit if $@; foreach my $ref( @{$rss->{items}} ) {   $title = $ref->{'title'};   $link = $ref->{'link'};   from_to( $title, 'utf8','shiftjis' );   print"[title] $title<br>\n";   print"[link] <a href=\"$link\" target=\"_blank\">$link</a><br>\n";   ----------------------------<br><br>\n"; } print"</BODY></HTML>\n"; RSSの取得方法はここを参考にしました。 http://www.rfs.jp/sb/perl/10/rss01.html 宜しくお願いします。

    • ベストアンサー
    • Perl
  • RSSからblogデータの抽出(直接URLを入力して)

    以前、「RSSからblog(ブログ)の本文を抽出したい」の質問にて、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1677591 回答を参考に、RSSからblogのタイトル・リンク・本文を 抽出するプログラムを作成させていただきました。 ところで、このプログラムは、参考サイトの http://www.hellohiro.com/xmldom.htm HelloWorldDOMPageList.javaを参考に作成したのですが、 このプログラムでは、参考サイトのプログラム中 // パースを実行してDocumentオブジェクトを取得 Document doc = builder.parse(new File("site.xml")); // ルート要素を取得(タグ名:site) Element root = doc.getDocumentElement(); System.out.println("ルート要素のタグ名:" + root.getTagName()); … にもあるように、対象となるXML(私の場合はRSS)を保存して、 そのファイルに対してプログラムを実行しています。 今回は、RSSからblog(ブログ)のタイトル・リンク・本文を抽出する際に、 対象となるRSSを一度、site.xmlなどにXML形式で保存して、 そのファイルに対してプログラムを実行するのではなく、 プログラム中でRSSのURLを入力して、 それに対してプログラムを実行できるようにしたいです。 例えば、RSSが、http://blog.livedoor.jp/example/index.rdfだとしたら、 プログラム中でこのURLを直接入力するようにして、プログラムを実行させたいです。 そのためにはどのようにプログラムを作成すればいいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • Data::Dumper;でダンプ後表示した文字列\x{30fc}...

    お世話になります。 下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか 表示時に日本語の所が\x{30fc}のような文字列になってしまいます。 これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。 どなたかご教授いただけませんでしょうか。 #!/usr/bin/perl BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } use XML::RSS; use Data::Dumper; my $rss = new XML::RSS; #表示形式の違いで1と2がある。 $Data::Dumper::Indent = 1; use open IN => ":utf8"; # 入力をUTF8とする use open OUT => ":shiftjis"; #use open ":std"; #use Encode; #use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'sjis'; #binmode STDOUT, ":encoding(utf-8)"; #binmode STDOUT, ":encoding(shiftjis)"; #binmode STDOUT, ":encoding(euc-jp)"; #use open ":encoding(shiftjis)"; # rssをセット。 open my $fh, '< ./test.rss'; my $text = join undef, <$fh>; close $fh; # rssをパース $rss->parse($text); # ひとまず中見を知る為にダンプしてみる print "Content-type:text/html;charset=Shift_JIS\n\n"; print "<html><head>\n"; print "<title></title></head>\n"; print "<body>\n"; print Data::Dumper->Dump([$rss]);

    • ベストアンサー
    • Perl
  • 変数に格納できる桁数に制限はあるの?

    スカラー変数に格納できる桁数に制限はあるのでしょうか? 制限があるとすれば、どうすれば解除できるのでしょうか? 具体的には下記のような手順です。 小数15位まである数値(整数部は3桁)を変数($hoge)に代入する。 $hoge = 123.123456789012345; 次に、この変数を他の変数($fuga)に代入する。 $fuga = $hoge; さらにこの変数をSmarthに渡してブラウザに表示させると、小数点以下が12桁までしか表示されません。 どうすれば15桁をそのまま表示させることができるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • ハッシュの中身の表示

    ハッシュの中身の確認ができなくて困っています。 下記のような実行文においてです。 当然、test の戻り値は、スカラーとハッシュです。ハッシュを戻すときには参照渡し記号の\もつけています。 my ($return_code, %hash_data) = test(); 表示しようとすると、 Hash(0x5b04) のような表示にしかなりません、、 (試した表示方法は、下記4つです。) (環境は、WindowsXP上での、ActivePerl-5.10.0.1004 です。) foreach $key ( keys( %Hash ) ) { print "キー値 : $key\n"; print "値 : $Hash{$key} \n " } while ( ( $key , $value ) = each %Hash ){ print "キー値 : $key\n"; print "値 : $value \n " ; } use Data::Dump qw(dump); print dump(\%hash); #print %display_test; 宜しくお願いします。

    • ベストアンサー
    • Perl
  • Perlでgoogle newsのRSSを取得2

    質問を閉め切った直後に気付いたもので、すいません!! QNo.3797932の、つづきなのですが、、、 教えていただいた以下の方法 ------------------------- #!/usr/local/bin/perl use LWP::Simple; use XML::RSS; use LWP::UserAgent; my $url = 'http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=aiko'; my $ua = new LWP::UserAgent; my $responce = $ua->get($url, 'User-Agent' => 'Mozilla/4.0'); my $data_from_web = $responce->content; print <<"HTML"; Content-type: text/html <html> HTML print $data_from_web; exit; ------------------------- の場合だと、ページ表示データは取得できるのですが、RSS特有のタグが 抜け落ちる為、その後の解析ができない事に気付きました。 なんとか、RSS特有のタグも含めてのRSS情報を入手する方法はないでしょうか? ちなみに、RSS特有のタグも含めてのRSS情報は、ブラウザーのURLの窓に http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=aiko このアドレスを直接入力してリターンキーを押すと、確認する事ができます。 度々申し訳ないのですが、よろしくご指導、お願い致します。

    • ベストアンサー
    • Perl

専門家に質問してみよう