- 締切済み
Activeperlのエラーメッセージ
こんにちわ。 perlについては、勉強はじめたばかりで、 まだ、使い方になれてない段階です。 それでサンプルを見ながら勉強しようと考えていますが、 それさえも、うまくいかない状態です。 現在、日経ソフトウェアの”ずばりわかるWebプログラミング2.0”を見て勉強しようとしています。 http://itpro.nikkeibp.co.jp/article/MAG/20070410/267630/ 第1部のpart2のサンプルが動かなくて困っています。 本に載っているようにactiveperlやapacheのインストールをして、 それぞれ、本のように動作設定して、 サンプルにあるアプリケーションIDを設定して実行しましたがエラーが出て動きません。 どうしてでしょうか? 動かない箇所は次のところのようです。 サンプルプログラム #最初途中 略 # Assemble all options. my $option_string = join('&', @option_list); my $url = "${request_url}?${option_string}"; # Retrieve result. print STDERR "\$url = ${url}\n"; my $response_string = get($url); my $response_hashref = XMLin(\$response_string); #以下、略 で、my $response_hashref = XMLin(\$response_string);の行を実行したときに、以下のようなmessageが出るようです。 no element found at line 1, column 0, byte -1 at C:/Perl/lib/XML/Parser.pm line187 まだまだ、初心者でサンプルを実行しながら、感覚を磨いていこうと思っていますが、 本には説明されていないようなメッセージが出て困っています。 ぜひ、アドバイスをお願いします。 実行環境 Activeperl5.8.8 build820 Web Server Apache2.0.59
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
推測が当たったようでよかったです。 > “条件つきで防御”にすると、起動時に問合せWindowがでて、 > アプリケーションごとに許可設定ができるのですが、 > このスクリプトの場合、インターネットのアクセスを許可するかどうか聞いてきませんでした。 とすると、通常は無条件で遮断とかなんでしょうか? > なにはともあれ、ようやく一歩を踏み出した形になりました。 > このqw(get)とはどういう意味でしょう? これは、 LWP::Simple というモジュール(LWPに属するSimpleという名前)で 定義しているメソッド(ここでは get)を、 LWP::Simple::get($url); とその属するパッケージをぞろぞろ書き連ねなくても get($url); のように書くようにできるための手続きです。 use LWP::Simple のあとに、そのモジュールの中にあって使いたい メソッドの名前を書き連ねて指定します。 qw(get) というのは、 ('get') と同じ意味です。 いちいちクォートしないですむので、 qw(foo bar baz hoge muga) のようにたくさんあるときは手間が違ってきます(qwでは空白が区切りとみなされます) > セキュリティソフトの問題はメーカに聞くべきなんでしょうね。 そうですね。 ノートン先生なら使っているのでわたしでも答えられたのですけど。
- sakusaker7
- ベストアンサー率62% (800/1280)
スクリプトがダウンロードできるようなので試してみました。 結論から言うと、 > あと、最初にあるサンプルにある >use LWP::Simple qw($ua get); > $ua->proxy('http','http://proxyo:80'); > の文も関係してくるんですかね? これでしょう。 わたしが今使っている環境はproxyがあるんですが、 ここの設定をきちんとしておかないと no element found at line 1, column 0, byte -1 at C:/Perl/lib/XML/Parser.pm line187 となりました。 horani09さんのお使いのネットワーク環境では proxyはないとのことですので、 use LWP::Simple qw($ua get); $ua->proxy('http','http://proxyo:80'); この行を use LWP::Simple qw(get); としてしまえば良いと思います。 にしてもなんでこんな半端な記述が? これで試してみて、結果をお知らせください。
- sakusaker7
- ベストアンサー率62% (800/1280)
ちょっと確認させてください。 > とりあえず、プロンプトから"perl yahoo_search.pl"実行しています。 質問の文にあるエラーメッセージはそうやって実行したときのものですか? で、スクリプトで組み立てられたURLをブラウザに放り込んで アクセスしたときにはちゃんとデータが取れている。 ということでよいですか? > そもそもこのメッセージが具体的にはどういうう意味なのでしょうか? XMLinというメソッドにデータを渡して、解析しようとしたけれども、 XMLとして正しい形式になっていない等で 解析できなかった。 ということでしょう。 メッセージにある数字から判断するとどうも空のデータが わたっているっぽいのですが。 ひょっとして、会社のネットワークか何かで proxyが入っていたりしてませんか? Internet Explorerだと ツール→インターネットオプション→接続 →LANの設定 のところでどこかにチェックが入っていたりしてませんか?
補足
いろいろ、ありがとうございます。昨日もいろいろやってみましたが、まだわかりません。 >スクリプトで組み立てられたURLをブラウザに放り込んで >アクセスしたときにはちゃんとデータが取れている。 はい、おっしゃるとおりです。 sakusaker7さんのXMLinのエラーメッセージの解説で少しわかりました。 my $response_string = get($url); my $response_hashref = XMLin($response_string); このget($url)が実際にインターネットにデータをリクエストするものですよね。 ちなみにget($url)の()内にurlの値を直接入れてみると、 Could not find yahoo_search.xml in .\ at yahoo_search.pl line 52 というメッセージも出ます。 yahoo_search.xmlの名前はどこにも指定していないのに、なぜないといってくるかわかりません。*.plに対するxmlはなんか作成しないといけないものなのでしょうか? また、どうも実際にtcpのパケットが出ていないようでもあります。 YahooのアプリケーションID管理のアクセス履歴を見ても履歴がないですし、 packetのモニタソフトも確認してみましたが、出ていないようです。 お話にあったインターネットエクスプロ-ラ設定を確認しましたが、プロクシを使用するなどの設定はしていません。 あと、最初にあるサンプルにある use LWP::Simple qw($ua get); $ua->proxy('http','http://proxyo:80'); の文も関係してくるんですかね? そもそも、サンプルのプログラムが動かないのは私だけなんでしょうかね? 第1部、part2(yahoo_search.pl) YahooのアプリケーションIDだけ自分で登録したものに変更して動作するはずなのですが、 http://itpro.nikkeibp.co.jp/article/MAG/20070410/267630/ 本ではDOS プロンプトの状態から実行で動くと書いてあったので、動くと思っているのですが、何か追加でsoftの設定とか必要なんでしょうか? セキュリティの設定は、エクスプローラでyahooのサイトが見れれば十分だと思っていますが、 ありがとうございます。
- sakusaker7
- ベストアンサー率62% (800/1280)
ちょっと情報が少ないし、そのスクリプトを実行するのもすぐには できないので推測ですが、 入力がきちんと取れてないんじゃないですか? > no element found at line 1, column 0, byte -1 at C:/Perl/lib/XML/Parser.pm line187 というメッセージから判断すると、 my $response_hashref = XMLin(\$response_string); ここでの引数 $response_sring の中身がちゃんとしたものかどうかが疑問です。 さらにさかのぼると # Retrieve result. my $response_string = get($url); で、指定のURLの中身を get で取得しており、さらにさかのぼると この$urlは my $option_string = join('&', @option_list); my $url = "${request_url}?${option_string}"; で組み立てているので、$request_url と $option_stringが どうなっているかが気になります。 一応 # Retrieve result. print STDERR "\$url = ${url}\n"; ということで中身を確かめようとされたようですが、拡張子から判断すると このスクリプトはcgiとして実行されるものなので、 標準エラー出力に送ってもブラウザで見るとかはできないのでは? use CGI::Carp しているスクリプトなので、 warn "\$url = ${url}\n"; とか croak "\$url = ${url}\n"; とするといいと思います。
補足
回答ありがとうございます。 回答されたことを元に、いろいろやってたら遅くなりました。 このスクリプトは、yahooのwebsearchで検索した結果をxmlで保存するようです。 とりあえず、プロンプトから"perl yahoo_search.pl"実行しています。 $urlは次のような値になるようです。 $url = http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?appid=practie1&query=perl&type=all&results=5&start=1&language=ja&sort=rank この部分をcopyしてブラウザで見ると、 Xmlの表示でちゃんと検索結果が見えます。 スクリプト実行時に エラーメッセージが出てその箇所でとまっているようです。 そもそもこのメッセージが具体的にはどういうう意味なのでしょうか? ありがとうございます。
補足
こんにちは、 試してみたところ use LWP::Simple qw(get); に変えたら条件つきでうまくいきました。 PCにウィルスセキュリティ(ソースネクスト)を設置してまして、 これにファイアウォールの機能を使わなければ、今までと同様のことが起こってました。 “条件つきで防御”にすると、起動時に問合せWindowがでて、 アプリケーションごとに許可設定ができるのですが、 このスクリプトの場合、インターネットのアクセスを許可するかどうか聞いてきませんでした。 なにはともあれ、ようやく一歩を踏み出した形になりました。 このqw(get)とはどういう意味でしょう? セキュリティソフトの問題はメーカに聞くべきなんでしょうね。 サポートに連絡してみようと思います。 ありがとうございました。