• 締切済み

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

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

推測が当たったようでよかったです。 > “条件つきで防御”にすると、起動時に問合せ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)
回答No.3

スクリプトがダウンロードできるようなので試してみました。 結論から言うと、 > あと、最初にあるサンプルにある >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); としてしまえば良いと思います。 にしてもなんでこんな半端な記述が? これで試してみて、結果をお知らせください。

horani09
質問者

補足

こんにちは、 試してみたところ use LWP::Simple qw(get); に変えたら条件つきでうまくいきました。 PCにウィルスセキュリティ(ソースネクスト)を設置してまして、 これにファイアウォールの機能を使わなければ、今までと同様のことが起こってました。 “条件つきで防御”にすると、起動時に問合せWindowがでて、 アプリケーションごとに許可設定ができるのですが、 このスクリプトの場合、インターネットのアクセスを許可するかどうか聞いてきませんでした。 なにはともあれ、ようやく一歩を踏み出した形になりました。 このqw(get)とはどういう意味でしょう? セキュリティソフトの問題はメーカに聞くべきなんでしょうね。 サポートに連絡してみようと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

ちょっと確認させてください。 > とりあえず、プロンプトから"perl yahoo_search.pl"実行しています。 質問の文にあるエラーメッセージはそうやって実行したときのものですか? で、スクリプトで組み立てられたURLをブラウザに放り込んで アクセスしたときにはちゃんとデータが取れている。 ということでよいですか? > そもそもこのメッセージが具体的にはどういうう意味なのでしょうか? XMLinというメソッドにデータを渡して、解析しようとしたけれども、 XMLとして正しい形式になっていない等で 解析できなかった。 ということでしょう。 メッセージにある数字から判断するとどうも空のデータが わたっているっぽいのですが。 ひょっとして、会社のネットワークか何かで proxyが入っていたりしてませんか? Internet Explorerだと ツール→インターネットオプション→接続 →LANの設定 のところでどこかにチェックが入っていたりしてませんか?

horani09
質問者

補足

いろいろ、ありがとうございます。昨日もいろいろやってみましたが、まだわかりません。 >スクリプトで組み立てられた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.1

ちょっと情報が少ないし、そのスクリプトを実行するのもすぐには できないので推測ですが、 入力がきちんと取れてないんじゃないですか? > 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"; とするといいと思います。

horani09
質問者

補足

回答ありがとうございます。 回答されたことを元に、いろいろやってたら遅くなりました。 このスクリプトは、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の表示でちゃんと検索結果が見えます。 スクリプト実行時に エラーメッセージが出てその箇所でとまっているようです。 そもそもこのメッセージが具体的にはどういうう意味なのでしょうか? ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • activeperl5.6が起動できない

    activeperl5.6が動きません。 activeperlをインストールして、apacheのhttpd.confの中身を本を参考に編集しました。 sampleのhello.plというファイルを自分の環境ではc:\www\cgi-binというフォルダーの中にいれ、 ScriptAlias /cgi-bin/ "C:/www/cgi-bin" <Directory "C:/www/cgi-bin"> AllowOverride None Options None AddHandler cgi-script .cgi .pl でcgiの実行を許可して AddType application/x-httpd-cgi .cgi AddType application/x-httpd-cgi .pl で拡張子とperlを関連付けています。 browserからたとえばhttp://localhost/hello.plを入力すると 実行が許可されていないとブラウザーで表示されます。 Forbidden You don't have permission to access /test.pl on this server. Apache/1.3.39 Server at localhost Port 80 アパッチのエラーログを見ると、 [error] [client 127.0.0.1] couldn't spawn child process: c:/

    • ベストアンサー
    • CGI
  • ActivePerlをインストールしたいんですが、Apacheを使っています。

    サーバはApache1.3.24です。ActivePerl5.6.1をインストールしたいのですが、全然分かりません。pathとかの設定は必要なんですか?また、どのように、実行するとか、どこに、perlのプログラムを保存するとか、分かりません。 1通り、分からないのですが。。。教えて下さい。良いホームページでもいいです。自分では、良いホームページを見つけることができませんでした。 基本的なことは分かっていますが、perlは全然知らないので。。お願いします。httpd.confとかも設定するのですか?

    • ベストアンサー
    • Perl
  • Perl5とActivePerl

    いつもお世話になっています。 HP制作をしており、やむを得ずPerl・CGIを勉強しています。 初めて3日目くらいの超初心者です。 大変基本的な質問で申し訳ないのですが、 PerlとActive Perlの違いが知りたいのです。 CGI自体はプログラミングされているものを購入して使うつもりで、今設置作業をしているのですが、Perlのことがあまりにも分からないので、「はじめてのPerl/CGIプログラミング」という本も読みながら進めています。 そのCGI開発元では環境条件として「Perl 5.00503以上がインストールされていること」とあるのですが、これはActivePerlとは別ですか? 本「はじめてのPerl/CGIプログラミング」にはActivePerl-5.8.7.813をインストールできるCDが付属しているので、可能ならこのActive Perlを使いたいのですが、無理なのでしょうか? 基本的な質問で申し訳ありませんが、どうぞよろしくお願いいたします。

    • ベストアンサー
    • CGI
  • ActivePerlでImage::Magick使いたいんですけど助けてください。

    OSはWinXPです。 ちなみにActivePerl-5.10.1.1006-MSWin32-x86-291086.msi(確か)でImage::MagickはImageMagick-6.6.1-Q8です。 perlでためしに作ってみた文章をいじるプログラムを実行すると問題なくできるのですが、画像をいじるプログラムを作って実行すると”core_rl_magick.dllが見つからなかったためこのアプリケーションを実行できません”というエラーメッセージが出ます。ActivePerlとImageMagickをインストールしなおしても同じエラーがでます。 今までは画像をいじるプログラムを実行してもでなかったので対応に困ってます。 最近セキュリティをking softにした時にセキュリティに引っかかったファイルをろくに見ずに消去してしまったので、もしかしたらその中に入っていたのかもしれません。 perlを勉強し始めたばかりなので困っています。もし対処法を知っている方がおりましたら教えてください。 よろしくお願いします。

  • ActivePerlで#!/usr/bin/が無効

    WindowsXPにActivePerl(5.16.3.1603)をインストールして、 コマンドラインに「perl script.scr」と入力して スクリプトファイルは実行できるのですが、 スクリプトファイルの1行目に「#!/usr/bin/perl」を記述して、 コマンドラインに「script.scr」と入力して実行しようとすると、 「C:\・・・\script.scrは有効なWin32アプリケーションではありません。」 というメッセージが表示されて正しく実行できません。 perl.exeのあるフォルダをC:\usr\binフォルダにして、 1行目を #!/usr/bin/perl #!C:/usr/bin/perl #!C:\usr\bin\perl などいろいろ試してみましたが、どれも 前述のメッセージが表示されて実行できませんでした。 コマンドラインに「script.scr」と入力するだけで 実行することができるようにするには どのようにすればいいのでしょうか。 script.scrの拡張子scrをplなどに変更して この拡張子のファイルに対してperl.exeに関連付けることにより script.plだけでも実行できるようにはなりますが 拡張子.scrではこの関連付けができませんので #!/usr/bin/perl等を使用する方法で解決したいです。 ジャンクションとかApacheなどが全く分かりませんので これらを使わずに簡単にできる方法がありましたら教えてください。 (なお使っても分かりやすい手順があれば可です) よろしくお願いします。

    • ベストアンサー
    • 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
  • ApachePOIでエラー

    ApachePOI3.9をインストールして、ECLIPSに入れて、サンプルコーディングを試して見ました。 実行したところ、次のエラーが表示されました。 java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/WorkbookFactory コーディング(抜粋)は以下の通りです。 import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.WorkbookFactory; public void doNippou(HttpServletRequest request, HttpServletResponse response) { String path = getServlet().getServletContext().getRealPath("document"); FileInputStream fi = new FileInputStream(path + File.separator + "A4nippou.xls"); Workbook wb = WorkbookFactory.create(fi); Sheet sheet1 = wb.getSheetAt(1); response.setContentType("application/msexcel"); String fname = "A4nippouyyyymmdd.xls" ; // ファイル名を設定 response.setHeader("Content-Disposition", "attachment; filename=" + fname); OutputStream out = response.getOutputStream(); wb.write(out); out.close(); } 実行環境は、CentOS5,Tomcat5.0,jdk1.4です。 Javaのバージョンが1.4ではApachePOI3.9が動かないのでしょうか。 よろしくお願いします。

  • ActivePerl 1行入力で 'と"がある場合

    ActivePerlの初心者ですが基本的なことが分からないので教えてください。 まだ覚えたばっかりで1行入力でいろいろ書式を入力して確認しながら覚えているのですが 例えば、ネット上に 各行の最初の10文字を捨てる perl -lne 'print substr($_, 10) = ""' file というようなサンプルが記述されているのですが 実際に入力してみると 「Can't find string terminator "'" anywhere before EOF at -e line 1.」 というようなエラーが出ます。 どうも ' が使えないようなのですが なぜエラーになるのかがよく分かりません。 この原因が分からないので試行錯誤で ' を " で行ったりして エラーを回避しながら確認しているのですが 上記のように ' と ' の中にさらに " と " がある場合には どのように回避したらよいのかがよく分かりません。 上記のような例の場合にはどのように入力すれば エラーが出なくなるのでしょうか。

    • ベストアンサー
    • Perl
  • 1行目、Perlの宣言

    ActivePerlをC:\Perlにインストールしました。するとperl.exeはC:\Perl\bin\perlにありました。 そこでCGIファイルの1行目に   #! C:/Perl/bin/perl としましたが、実行してみるとコードがそのまま表示されてしまいます。 「Perl」と大文字を含むからかと「P」を小文字に変えてみたり、あるいは「/」を「\」にしてみたりと試しましたが、やはり機能しません。 httpd.confは教科書に書いてある通りに書き換えました。 何が原因でCGIがまともに動かないのでしょう。 OSはWindows Vista、Apacheは2.0.54、ActivePerlは5.8.7.813です。

    • ベストアンサー
    • CGI
  • ActivePerl-5.10.0.1004の日本語対応にする方法

    超初心者の質問ですみません。 今、Perlの絵本でActivePerlの勉強中ですが use encording"shiftjis"; $a=1; print "はじめは$aでした。\n"; $a=++; print "1増えて$aになりました。\n"; $a=--; print "1減って$aに戻りました。\n"; を実行しても、 Can't locate encording.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib . ) at hello8.pl line 1. BEGIN failed--compilation aborted at hello8.pl line 1. と表示されます。 解消法を教えてください。