スクリプト動作に関する問題と解決方法

このQ&Aのポイント
  • 公開されているスクリプトを動かそうとして500エラーが発生しています。
  • perlのモジュールが不足しているため、JcodeとXML::Simpleをインストールしましたが問題は解決しませんでした。
  • スクリプトの書き方が理解できず、一からスクリプトを書くことも難しい状況です。助言やヒントをいただけるとありがたいです。
回答を見る
  • ベストアンサー

http://www.drk7.jp/MT/archives/0011

http://www.drk7.jp/MT/archives/001174.html こちらで公開されているスクリプトを動かそうとしたのですが500エラーになってしまいます。 perl5.88がインストールされているローカル環境で動かそうとしたところ、Jcodeと、XML::Simpleがインストールされていなかったのでインストールして、 use CGI; use Jcode; use LWP::UserAgent; use XML::Simple; use Data::Dumper; これらが動くようにしましたが、このスクリプト自体は相変わらず500エラーになってしまいます。 perlの知識が余りないのでこれ以上の原因を突き止める方法もよくわかりません。 公開されているコードの#!/usr/bin/perl -w から、最終行までをコピーして、そのまま動かそうとしているのですが、 他に何かを付け足す必要があるのでしょうか? 自分の知識では、このスクリプトの書き方がさっぱり理解できないので、お手上げです。 何度挑戦しても駄目だったのと、モジュールを使った書き方自体がよくわからないので、use LWP::UserAgent;以外のモジュールを使わない書き方で一からスクリプトを書き始めたのですが、一週間経過してもまったく完成せず今の自分の知識では無理なようです。 どうか、この公開されているスクリプトを動かす為のヒントをご教授いただけないでしょうか。 よろしくお願いいたします。

  • Perl
  • 回答数5
  • ありがとう数9

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

  • ベストアンサー
  • luka3
  • ベストアンサー率74% (306/409)
回答No.1

実行して確認したわけではないですが、気になる点がいくつか。 500エラーということはどこかのホームページに置いてCGIとして実行したということでしょうか? 「3時間ほど結果が帰ってこないのでご注意を。」とありますので、CGIとして実行するには不向きだと思います。 それとスクリプト中の「[YOUR_developerID]」はそのまま使ってはいけません。 楽天ウェブサービス http://webservice.rakuten.co.jp/ から、デベロッパーIDを取得してそのIDに書き換えてください。 あとは1行目「#!/usr/bin/perl -w」の /usr/bin/perl のパスは正しいですか? どこまで実行できているか確認するために、自分で任意の場所にprint文でメッセージを出せるくらいの最低限の知識は必要と思います。

yasainet
質問者

お礼

回答ありがとうございます。 申し訳ありません、そのままコピーしたというのは間違いでした。 $apiの部分を以下のように変更してありました。 http://api.rakuten.co.jp/rws/3.0/rest?developerId=自分で取得したディベロッパーID=GenreSearch&version=2007-04-11&genrePath=0&genreId= 基本的には、コマンドラインで実行するためのスクリプトだったのですね。 コマンドラインはほとんど使ったことがないので、勉強してから実行してみようと思います。 このスクリプトが書いていることの意味がほとんどわからないので、 どこを変更すれば、実行結果を任意の場所にprint出来るかさえもわかりません。 それくらいの知識もないので、自分には難しいスクリプトだったみたいです。 勉強してみます。有難うございました。

その他の回答 (4)

  • yuoke
  • ベストアンサー率53% (8/15)
回答No.5

No.4の補足です 今の私の環境がスマートフォンで、 参照先のプログラムの$apiの中身が、 「~devel」までしか確認出来なかったので、 間違えてるかも知れませんが、さらにその先の楽天のページの 書き方を確認したところIDの後に「&operation」が 必要な気がしますが、参照先には、その記述が有りませんか?

yasainet
質問者

お礼

回答有難うございます。 operationはGenreSearchを指定してあります。 xmlは正しく取得できているようなので、後はスクリプトの使い方だけだと思うのですが、よくわかりません。 perlの専門書はまったく読んだことがなくて、作りたいものを作成する時にだけ必要な機能についてwebで少しずつ勉強しているだけの知識しかありません。 せめて、基本が書かれている専門書を読破して、書かれているコードの意味をある程度理解出来る知識がないと難しいみたいですね。

yasainet
質問者

補足

同様の形式でデーターを取得する自作で作成していたスクリプトを見直していたところ、 ループのところに問題があったようで、少し修正したら、正常に取得できるようになりました。 なので、配布されているスクリプトが必要なくなりました。 勉強の為にも、動かせるようになった方がよいので、こちらのスクリプトももう少し試行錯誤してみようと思います。 みなさま、どうも有難うございました。

  • yuoke
  • ベストアンサー率53% (8/15)
回答No.4

$apiで指定した文字列の直後に「0」を追加したurlを ブラウザで見てみて下さい。 そこでxmlが表示されれば、コマンドから実行すれば、 正しく表示されると思われます。 xmlが表示されなければ、$apiの書き方に問題がありますので、 必要な文字が抜けてないか確認して下さい。 正しく動くようになれば、結果は標準出力に出るので、 適当なファイルにリダイレクトしてやれば、望み通りの結果になると思います。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.3

別にファイルへ出力しなくても実行過程での変数を表示するようにすればいいと思います。 まず、どこまで正常に実行できているのかを把握するには  print "Trap 番号\n"; 場所によって場号を変えて実行されている順番を見る 変数の中身を確認する  print $変数名."\n"; などをでたらめでなくこの辺はどうだろうと当たりをつけて入れてみたらどうでしょう。 まずは地道にトライしてみてください。

yasainet
質問者

お礼

有難うございます。 ループに入る前の23行目まではprintで表示されるのですが、ループに入る23行目以降にprintを入れると何も表示されなくなります。コマンドでも次の$が表示されているので、処理待ち状態にもなっていない?ようなのですが、基本的な知識もあまりないため、基本的なところでミスしているかも知れません。 地道にトライしてみてもどうしても駄目なようでしたら、 自分で作成中のスクリプトを完成させてみようと思います。約80%以上のところまでは完成していると思いますが、 そこら辺から行き詰って、頭の中がゴチャゴチャになって諦めました。これも基本的なところで間違えているような気もするので見直してみます。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

そもそもHTTPヘッダの出力部が見当たらないのでコマンドラインで実行しなければいけないのでは。 ループでprintしている手前に「print "Content-type: text/plain\n\n";」とか入れておけばNo.1さんが指摘しているWebサーバのタイムアウトと楽天IDの問題をクリアすればいけなくはないかも。 でもコマンドラインが前提なのでは?

yasainet
質問者

お礼

有難うございます。ブラウザで実行させて、ファイルに書き出せればと思っていたのですが、コマンドラインで実行させる用のスクリプトだったのですね。コマンドラインでperlを実行させたことがないので、勉強して挑戦してみます。

yasainet
質問者

補足

コマンドラインでperlを実行してみました。 #!/usr/bin/perl use strict; use warnings; print "Hello, world!\n"; 上の実行結果は表示できました。 ただ、質問のスクリプトの場合は実行結果が出ずに、瞬時に次の$が表示されてしまいます。 $ パールのパス $ このスクリプトを起動した場合は、apacheのログ等に実行結果がプリントされるようになっているのでしょうか?出来れば、ファイルに実行結果を書き込むための改造方法をお教えいただければと思います。申し訳ないですが、よろしくお願いいたします。

関連するQ&A

  • LWPモジュールについて教えてください。

    プログラミングは初心者です。 LWPモジュールのサブクラスLWP::Simpleの get()という関数を使いたいです。 現在、Perlは5.005_3を使用しています。 use LWP::Simple; require LWP::Simple; ・ get(URL) と入れると、500 Internal Server Errorと言うものが出てしまいます。 LWPを使うとき、どのようにすれば使えるのかご指導お願いいたします。

    • ベストアンサー
    • Perl
  • main::getのモジュール?

    Perl5.6(Win)を使っております。 Perlで過去にスクリプトを書いたのですが、 Undefined subroutine &main::get called at ./test.pl line 312. とエラーが出たので、 use LWP::Simple;かなと思い。モジュールを追加したのですが まだエラーが表示されます。 main::getと、名前空間まで同じになので、何か細工していたのかな と思っていましたが、思い出せません。 他にどんなモジュールがあるのでしょうか? また、現在インストールしているモジュールの一覧とかわかる方法はありますか?

    • ベストアンサー
    • Perl
  • フリーのCGIをダウンロードしてきたんですがうまくインストールできません。

    他項目の質問になってしまうかもしれませんが宜しくお願いします。 フリーのCGI(PwBlog)をダウンロードしてきたんですがインストール時に以下のエラーがでてしまいます。 必須Perlモジュール   Jcode     →インストール済みです   DBD::Pg     →インストールされていません   LWP::UserAgent     →インストール済みです   Mail::Audit     →インストールされていません   Mail::Audit::Attach     →インストールされていません   Class::Accessor     →インストールされていません   XML::RSS     →インストール済みです   Mail::Sender     →インストールされていません   Image::Magick     →インストール済みです   Date::Calc     →インストールされていません   XML::Simple     →インストール済みです です。 インストールされていませんと表示されるものはダウンロードしたあとで何処にインストールすればよいのですか? また、ダウンロードを何処で行なえばいいのか解らない物もあります。 他項目の質問ですみませんがご教授お願いします。

    • 締切済み
    • CGI
  • Perlで言う、LWP HTTPをPHPで

    PerlでのスクリプトをPHPに移行しようかと考えております。(勉強のため) それで、PerlのモジュールでいうLWPとHTTPに代わるクラスライブラリ(API)は、どれにあたるのでしょうか? 具体的には、LWP::UserAgentとHTTP::Requestです。 ※詳しくは、 my $wa = new LWP::UserAgent; my $req = new HTTP::Request(GET => $url); my $res = $wa->request($req); PHPのドキュメント(http://www.php.net/manual/ja/)を見たのですが、いまいちピンときませんでした。 参考URLで結構ですので、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Perl LWPでproxyがうまく刺さらない

    Perl初心者です。 LWPでどうしてもproxyが通りません・・・。 何が悪いのかわかりません。教えてください。 モジュールは全て導入を確認しました。 よろしくお願いします。 稚拙なミスだったらごめんなさい。 use LWP::Simple; use LWP::UserAgent; use HTTP::Request::Common; my $ua = LWP::UserAgent->new( timeout=>"5" ); #cybersyndromeさんからLWP::Simpleでproxyを取得 $_ = get('http://www.cybersyndrome.net/pla5.html'); #proxyをリストに代入 (@proxy_list)=/\"\>(.*?)\<\/a\>\<\/li\>\<li\>/g; #適当なサイトをリクエストのターゲットに $r = new HTTP::Request GET,('http://taruo.net/e/'); #前述のターゲットへリクエストしてひとつづつproxyが通るか確かめたいのに何故かすべてすぐにERRORに for($i = 0;$i <= 10;$i++){ $proxy = 'http://'.$proxy_list[$i]; $ua->proxy ([qw(http https)] , $proxy); $req = $ua->request($r); if ($req->is_success) { print "Success!\n"; }else{ print "Error\n"; } }

    • ベストアンサー
    • 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::UserAgentとXMLRPC::Liteを利用しようとしたところ、 サーバにインストールされていないのでエラーになりました インストールをしたいのですが、権限がないため (プロバイダーのスペースの為)インストールできません このような場合にはどうしたらよいのでしょうか jcode.pmのようにcgiスクリプトと同じ階層ディレクトリに設置する だけで動くものなのでしょうか? 大変困っております 皆さんのお知恵をお貸しくださいませ 以上、宜しくお願いします

    • ベストアンサー
    • Perl
  • Perlのライセンス(GLP、Artistic License)

    XML::RSSモジュールをCPANからダウンロードして使用することを考えています。 お客さまの社内システムの構築をPerlベースでしており、 お客さま環境にモジュールをインストールして わたしが作成したスクリプトで、XML::RSSモジュールをライブラリのようにして使用するつもりです。 XML::RSSモジュールの中身は一切変更しません。 このXML::RSSモジュールのライセンスは、Perlと同じ=GLPかArtistic Licenseのどちらか、ということになっていますが ライセンスについて考えなきゃならないのが初めてなので ぐーぐる先生にきいていろいろ見てみても どうも実際的に必要なことが理解できません。 バカですみません。 上記のような使い方をするときに、具体的にわたしがしなければならないことは何かあるのでしょうか? モジュール作成者の名前をわたしの作成したスクリプトにも書いとかなきゃいけない、とか わたしの作成したスクリプトを全世界に公開しなきゃならない、とか。 簡単に教えていただけると、たいへんに助かります。 よろしくおねがいしまっす。

  • MP3情報の表示

    Windowsで作ったMP3ファイルのタグ情報をちゃんと表示するためにPerlスクリプトを作っているのですが、 Jcodeでeucに変換する所でエラーになってしまいます。 どこをどう直せばちゃんと表示できるようになるのかわかる方がいらっしゃいましたら教えてください。 == mp3info.pl ====== #!/usr/local/bin/perl -w use MP3::Info; use Data::Dumper; usr Jcode; my $file = $ARGV[0]; my $tag = get_mp3tag($file); my $info = get_mp3info$file); my $jtag = jcode($tag)->euc; print Dumper($jtag, $info); ============ $./mp3info.pl aaa.mp3 $Not a SCALAR reference at /usr/lib/perl5/site_perl/5.6.1/i686-linux-multi/Jcode.pm line 579.

    • ベストアンサー
    • Perl
  • alarmのタイムアウト後の処理でスクリプトを止めない方法をご教授ください

    はじめまして。 現在perlで簡単なRSSリーダーを作っています。 簡単に書けば下記のようなスクリプトです。 use LWP::Simple; use XML::RSS; foreach(@hoge) { # @hogeはrssファイルのURL $SIG{ALRM} = sub{ die("alarm_error"); }; alarm 10; $rss->parse($_); alarm 0; } rssファイルをとりにいって10秒たって取得できなければnextで次のrssファイルへという形にしたいのですがどうもやり方がわかりません。 いろんなところで調べてもタイムアウト後はdie等によって強制終了するやり方しか見つかりませんでした。 タイムアウト後nextを使えるやり方をご存知のかたおられたらお教えください。 よろしくお願いします。

    • ベストアンサー
    • Perl