関数でxml::simpleが使えない。

このQ&Aのポイント
  • 関数を使ってxml::simpleを利用する際に問題が発生しています。
  • ハッシュを関数の引数や返り値にすると正常に動作しないため、別の方法を模索しています。
  • $XMLtreeはハッシュのリファレンスの塊であり、関数から外側に渡す方法を求めています。
回答を見る
  • ベストアンサー

関数でxml::simpleが使えない。

AWSがらみで以下のようなことがしたいです。 --------------- my $url = 'amazon web service RESTのURL'; my %XMLtree = xmlget($url); sub xmlget{ my $url = shift; my $content = LWP::Simple::get($url); #xml->hash変換 my $xs = new XML::Simple(); my $XMLtree = $xs->XMLin($content); return $XMLtree; } ----------------------- しかしハッシュを関数の引数や返り値にすると上手く動きませんでした。 そこでreturnで値を渡さずに、globalで%XMLtreeを宣言してXMLinの値を代入しようとしたのですがうまくいきません。 他にもリファレンスを渡してみたりしたのですが上手くいきません。 よく考えたら$XMLtreeはハッシュのリファレンスの塊なので、トップのアドレスを渡しても、関数を抜けてしまえば実体は消えます。(ですよね?) ハッシュのリファレンスの塊である$XMltreeを関数から外側に渡すにはどうすればいいでしょうか? それとも全く別の問題なのでしょうか?

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

return $XMLtree; は、リファレンスを返しているので my $XMLtree = xmlget($url); で受けて、リファレンスとして操作すればいいです。 >関数を抜けてしまえば実体は消えます。(ですよね?) Perlの場合、参照している変数がある限り実体は消えません。 この場合、return したリファレンスを参照している変数(つまり返した値を代入している変数)が生きている限り大丈夫です。 変数の内容が良くわからない場合 use Data::Dumper; print Dumper(変数); するといいと思います。

abu_kame
質問者

お礼

ありがとうございました。解決しました。 原因はmainの受ける側で定義しているハッシュのリファレンスの変数を%で定義していたために奇妙なことになってしまいました。 1.参照している変数が有る限り残っている 2.Data::Dumper これらが非常に参考になりました。ありがとうございました。

関連するQ&A

  • XML::Simpleの使い方について

    下記のような、プログラムを書いたのですが、上のタイトルはとれるのですが、連続して出てくるentryがどうしても取得できません。 何かご助言頂ければありがたいです。 my $url = "http://blog.livedoor.jp/takapon_ceo/atom.xml"; my $xml = get($url); my $tree = XMLin($xml); my $title = $tree->{title}; print "$title"; for (my $i = 0; $i <= 5; $i++) { $id[$i] = $tree->{'entry'}->[$i]->{'id'}; print "$id[$i]"; } よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlの XMLin()はPHPではどうなるのでしょうか? PerlからPHP part3

    Perlの以下のソースをPHPに置き換えた場合、 どのように書くのが一般的でしょうか? PHPは4.3系を使っています。 # Perl use XML::Simple; my $xml = XMLin( $content ); my $namae = $xml->{NAMAE}; PHPとXMLのお勧め本も知りたいです。

    • ベストアンサー
    • PHP
  • XML::Simple

    xmlファイルの中の<service>aa001</service>のaa001の値が 取得できません。 <service>のセクションが複数行あるとうまくデータの取得可能ですが。 複数または一行の<service>からのデータ取得できないのでしょうか? **************************************************** use XML::Simple; my $root = XMLin(".\\test.xml"); #test.xml---------------------------------------- #<?xml version="1.0" encoding="utf-8" ?> #<root> #<server no ="1"> # <MMM>0000000001</MMM> # <service>aa001</service> # <WWW>a001</WWW> # <WWW>b001</WWW> #</server> #<server no ="2"> # <MMM>0000000002</MMM> # <service>aa002</service> # <service>bb002</service> # <service>cc002</service> # <WWW>a002</WWW> # <WWW>b002</WWW> #</server> #</root> #---------------------------------------- for my $Serv (@{$root->{'server'}}){ foreach my $Service (@{$Serv->{'service'}}){ print "$Service\n"; } }

    • ベストアンサー
    • Perl
  • 正規表現で指定範囲の文字列の取得

    perlでRSSファイルを取得してTITLEタグの内容を抜き出したいのですが、 XML::RSSが使えない状況では、どのようにしたらいいでしょうか? my $document = LWP::Simple::get($url)後に正規表現で取り出して print タイトル<br>という風に表示しようと思っています。 よろしくお願いします。 ----下記のページを参考にしています。 http://www.itmedia.co.jp/enterprise/articles/0702/22/news014.html

    • ベストアンサー
    • Perl
  • file関数によるXMLの取得について

    XMLの取得をしようとしているのですが、PHPのバージョンが4.1のためSimpleXMLが使えずfile関数を使おうとしています。 例えば取得したいXMLの値が、 <Result>  <Title>タイトル</Title>  <Summary>  文章  </Summary>  <Url>  http://  </Url> </Result> だった場合、<Title>,<Summary>,<Url>はどのように取得するのでしょうか? 以下の方法で取得をしてみようとしたのですが、これだと<Summary>と<Url>は取得できるのですが<Title>が取得できません... ↓<Title>を取得する場合 $api_url = "http://"; $api_url2 = implode("",file("$api_url")); $title_exp = explode("<Title>",$api_url2); $title_count = count($title_exp); for($i=0;$i<$title_count;$i++){ $title = explode("</Title>",$title_exp[$i]); }; <Title>が他の項目と違うところは改行がない部分だけのようなのですが、どのようにすれば取得できるのでしょうか? 色々なサイトを見ながら手探りで学んでいますのでおかしなところがあるかもしれません。 その点もご指摘いただければ幸いです。 宜しくお願いします。

    • 締切済み
    • PHP
  • PerlでXMLがデコード出来ません。

    いつもお世話になっております。 今回も質問させていただきます。 PerlでhttpリクエストをしてXMLで返ってくるapiを使っているのですが、 英語で返答が来る時にはバックスラッシュが入っておらず成功するのですが、 日本語で返答が来ると、バックスラッシュがxml内部に記述されて Cannot decode string with wide characters と怒られます。 my $http2 = get($trans_url); my $result2=XML::Simple->new()->XMLin($http2); use CGI::Carp qw(fatalsToBrowser); die Dumper $result2; とダンプすると 成功するとき <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">testtest</string> 失敗するとき <string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">\x{79c1}\x{306f}\x{65e5}\x{672c}\x{4eba}\x{3067}\x{3059}\x{3002}</string> と、明らかに「¥」が入っているときにデコードに失敗しているのですが、 このXMLの中の”の前の¥マークを取り除くことが出来ませんか? お知恵を拝借できればと思います。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • [Perl]Shift-JISのXMLを解析する場

    行き詰まってしまったので教えて下さい。 <やりたいこと> とあるAPIからXMLファイルを取得し、解析して出力する、ということをやっているのですが、元のXMLがShift-JISでエンコーディングされており、これをUTF-8に変換して出力しようとしています。 <問題> XMLを取得して解析、取り出したいパラメータが出力できるようにはなったのですが、文字のエンコーディングが上手く行っていないためか、文字化けしてしまいます。 <元のXML> <?xml version="1.0" encoding="Shift_JIS"?>  <test>   <prod count=3>    <record>     <code>アイウエ</code>    </record>    <record>     <code>カキクケ-</code>    </record>    <record>     <code>ABC</code>    </record>   </prod>  </test> <XML解析用のコード> #!usr/bin/perl use utf8; use Encode qw/ from_to encode decode /; use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /; use LWP::UserAgent; use XML::Simple; use Data::Dumper; #--XML取得部分省略 #--XMLはgetで$xmlに格納 $from = guess_encoding($xml)->name; &from_to($xml,$from,"utf8"); $XML::Simple::PREFFERRED_PARSER = 'XML::SAX::PurePerl'; $xs = new XML::Simple(); $ref = $xs->XMLin($xml); $xml =~ s/<\?.*\?>//; for($i=0;$i<=$#{$ref->{'test'}->{'prod'}->{'record'}};$i++){  $name = $ref->{'test'}->{'prod'}->{'record'}[$i]->{'code'}; $name = encode('utf-8',$name); print "$i : $name\n"; } <結果> 黒ダイヤに?文字で文字化けして出力される。 どなたか原因がお分かりになりますでしょうか。 よろしくお願いいたします。

  • LWPで応答データを取得できない

    お世話になります。 perl5でLWPを使用しているのですが、一部のサイトでデータを取得できず困っております。 具体的には my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/5.0'); my $req = HTTP::Request->new(GET => "http://misshiki.blog7.fc2.com/?xml"); my $res = $ua->request($req); my $buf = $res->content; といった感じでRSSを取得したいのですが、$bufが空になってしまいます。 しかし、 $res->as_string とすると、レスポンスヘッダも含めてRSSが取得できていることが確認できます。 また、上記以外のURLでは正常に$res->contentでデータを取得することができています。 どうもFC2ブログのRSSのみの事象のようではあるのですが、対処方法がわからず困っております。 対策をご教授いただければ幸いです。 以上、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • リファレンスをサブルーチンの戻り値にしてもOKですか?

    ■ サブルーチン内部で処理した結果を格納した、配列、ハッシュ、スカラーなどのデータを戻り値として利用する必要があります。その場合、どうするのが標準的なやり方でしょうか? ■ return (配列へのリファレンス, ハッシュへのリファレンス, スカラー); などとやってしまっても問題はないでしょうか? ■ 下のプログラムを試したところ、予想に反しちゃんと 「31415」と表示されました。 #!/usr/bin/perl -w sub subroutine{ my @a = (3, 1, 4, 1, 5); return \@a; } my $b = subroutine{}; print @$b; ■ サブルーチン内部で使用した変数へのリファレンスをサブルーチン 外で使っていいのだろうか? サブルーチンの処理が終了した時点でサブルーチン内部で使用した 変数はメモリーから消去されるのかと思ったものですから。

    • ベストアンサー
    • Perl
  • PHPからFlashにXMLをそのまま渡す方法

    こんにちは PHPでXMLファイルを読み込み、それをそのままFlashに渡しFlash側でXMLをパーサしようと、このように書きました ------------------------------------------------------- (PHP) <?php $url = 'test.xml'; $h = fopen($url, "r"); $result_xml= ''; while(!feof($h)) { $result_xml.= fread($h, 4096); } fclose($h); echo "&data=$result_xml&"; ?> ------------------------------------------------------- (Flash) var xml:XML = new XML(); xml.load("work.php"); xml.onLoad = function(success:Boolean):Void { if (success) { trace(this.data); } }; ------------------------------------------------------- するとtraceの結果はundefinedでした。 PHPの出力結果が文字列型だということが原因のような気がするのですが、PHP側から文字列で出力するのではなく、XMLで出力するにはどうしたらよいでしょうか? リファレンスを探してみたのですが、なかなかそういった関数が見つかりませんでした。 よろしくお願いします。

専門家に質問してみよう