• ベストアンサー

サーバー移設に伴うReadParse関数の問題

Perlで、サーバー移設に伴う問題です。 どのように対処すれば良いのか知恵をお貸し下さい。 sakuraサーバーからxreaのサーバーへ移行する際の問題です。 以下ソースの抜粋です。 ----- &ReadParse(*form); if($form{'mode'} eq ''){ return; } ----- sakuraサーバーでは、上記で問題なく動いています。 xreaサーバーに移行しようとするとエラーが出るので調べてみたところ、 URL引数に問題があることがわかりました。 sakuraサーバーでは (URL)?mode=xxxx (URL) のどちらの表記も動きます。引数が指定されていない場合は空の文字列となるようです。 xreaサーバーでは (URL)?mode=xxxx でしか動かないのです。空の文字列と認識されてくれず、下記のエラーが出てしまいます。 --- Use of uninitialized value in string eq at /virtual/akamitori/public_html/jobhunt/memberlist/cgi-bin/memberlist_.cgi line 48. --- どのように対処すれば良いでしょうか?

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

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.4

> ハッシュからキーを取り出すことができるようで、 > これをsakusaker7さんの方法でループさせてチェックすれば > 大丈夫なのではないかと思っております。 残念ながらハッシュに入っていないキーを参照しているために出ている ワーニングです。 なので sakusaker7 さんがやっているようにキー文字列を明示的に あたえてやる必要があります。気づきませんでしたが、sakusaker7 さんの 意図したコードは、下記になると思います。 my @keys = qw( キー文字列を列挙 ); foreaech my $key (@keys) { $form{$key} ||= ''; }

satori_jp
質問者

お礼

>残念ながらハッシュに入っていないキーを参照しているために出ている >ワーニングです。 あっ・・・ すいませんそうですね、そうですよね・・・ 大変基本的なところの解釈が間違っていたようです。 どうもご丁寧にありがとうございました。 解決しましたので、これで回答を締め切らせていただきます。

その他の回答 (3)

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.3

ログにワーニングが出るだけであれば、そのまま放置してもよいように思います。 > URLから参照されるキー文字列は不定、という条件も入ります。 とのことですが、明示的に参照しているため発生しているわけで、 せっかく対処するのであれば sakusaker7 さんのおっしゃるように 使用する変数をチェックするべきだと思います。 ワーニングを止めるため no warnings 'uninitialized' という方法もありますが、お勧めできません。

参考URL:
http://d.hatena.ne.jp/charsbar/20060908/1157694389
satori_jp
質問者

補足

ご回答ありがとうございます。 ワーニングを止める事は考えておりませんが、 アドバイスは大変ありがたく受け止めております。 いまさらながらエラーメッセージ内で、 サーバー名を晒していることに気づきました。 ・・・恐縮です。差し支えのない名前でよかったですが・・・ まだ試しておりませんが、 ハッシュからキーを取り出すことができるようで、 これをsakusaker7さんの方法でループさせてチェックすれば 大丈夫なのではないかと思っております。 http://katsubemakito.net/cgiperl/variable/hash/post-46.html もうしばらくしたら質問の締め切りをさせていただきます。

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

えーと、新サーバーでも ・何もデータがなかったときにも警告が出ないようにして ・空文字列は空文字列としてチェックしたい ということですか? > return if (defined($from{mode}); returnn if (!defined($form{mode} || $form{mode} eq ''); のように未定義のときはそのハッシュ要素を参照しないようにすれば 警告は出ないですみますが、冗長でいやとか? > ReadParseから連想配列を取り出して、それを利用して > 空の文字列を代入すれば解決しそうだと思っているのですが、 > 可能なのでしょうか・・・ えーとすみません。ちと具体的なイメージがわかないのですが。 あらかじめ参照するキーが決まっていて、それに対応するハッシュ要素が 未定義なら空文字列にしておきたいということなら my $keys = qw( キー文字列を列挙 ); foreaech my $key (keys %form) { $form{$key} ||= ''; } とか。 あー、値が数値のゼロでも空文字列にしちゃうか? すんません。もう寝るので必要ならこの後はまたということで。

satori_jp
質問者

補足

重ねての回答ありがとうございます。 >・何もデータがなかったときにも警告が出ないようにして >・空文字列は空文字列としてチェックしたい >ということですか? そのとおりです。 >(略) >のように未定義のときはそのハッシュ要素を参照しないようにすれば >警告は出ないですみますが、冗長でいやとか? はい、全くそのとおりです。 説明不足で申し訳ありませんが、 さらに付け加えさせていただくなら、 URLから参照されるキー文字列は不定、という条件も入ります。 1つのソースだけでなく、複数のソースに対応させたいもので、 スマートな解決方法があればと思っているのです。 キー文字列をあらかじめ列挙するのでしたらおっしゃる通りなのですが、 なんとかならないものでしょうか?

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

Perlで、サーバー移設に伴う問題です。 どのように対処すれば良いのか知恵をお貸し... - Yahoo!知恵袋 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1314413453 にあったやり取りから考えると > if($form{'mode'} eq ''){ return; } 空文字列と比較するのではなくて return if (defined($from{mode}); のように defined でチェックすればいいのでは?

satori_jp
質問者

補足

回答ありがとうございます。 全くそのとおりなのですが、空の文字列が入ることもあるのです。 ReadParseから連想配列を取り出して、それを利用して 空の文字列を代入すれば解決しそうだと思っているのですが、 可能なのでしょうか・・・ Yahooの方ではもう回答が出そうになかったので締め切りましたが、 こちらでは引き続き募集いたします。

関連するQ&A

  • この意味を教えて下さい。

    よく、CGIを見ていると始めのほうにこのような行があるのですが、 これはどうゆう意味があるのでしょうか? if ($FORM{'mode'} eq 'view') { &view;exit; } elsif ($FORM{'mode'} eq 'delete') { &delete; } elsif ($FORM{'mode'} eq 'input') { &input; } また、「$FORM{'mode'} 」の意味も教えていただきたいのですが・・・。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • サーバーの移転を検討しています(XREA ハッスル等)

    現在シーサイドネットのサブドメインで借りています(月額735円) 今のサーバーに不満はないのですが、サイト自体がそれほど大規模でなくアクセス数もそれほどないのでもう少し安いサーバーに引越ししたいと考えています。 それとこの先の移転のことを考えてドメインを取得しようとも思っています。 ロリポップ・サクラ・ハッスル・ステップ・XREAと比べて、ハッスルかXREAがいいなぁと思うのですが、XREAはなんだか難しそうで悩んでしまいます。 素材配布サイトで、アフィリエイトも少々やっています。(1日150~200HIT) CGIは掲示板・ブログ・メールフォーム程度が設置できればいいです。 ffftpの設定やCGIの設置ぐらいまでなら何とか出来る程度の知識しかありません。 この条件でオススメなのはどのサーバーでしょうか?

  • XREAをやめて別のサーバに移転するのにオススメは?

    現在XREAサーバを有料版で使用しています。 下記リンクにあるように、障害が多発し、非常に困っています。 http://sb.xrea.com/showthread.php?t=13123 FTPはまだしも メールなんかしょっちゅう、受信できなくなります。 安かろう悪かろうの鯖をこの際、やめたいと思っています。 そこで、XREAが安すぎて、比較するにも どこのサーバに引越しをしようかなと迷っています。 WADAXやSAKURAなど有名どころがいっぱいありますが ロリポップ以外でオススメのサーバがありましたら教えてください。 希望するのは ・電話でのサポートがあればよい ・容量が1GB以上あればよい ・月額2000円までならOK 1000円以下ならうれしい☆ ・SSIやCGI、jsなど使えることは絶対条件 上記以外でも、みなさんがつかわれていて 満足しているサーバを教えてください☆ できれば、そのWEBサイトも教えてください。

  • form actionでよそのサーバーのcgiファイルが読込めない。

    form actionに外のサーバーのcgiファイルを指定しています。 ドメイン名以下のパスは通っているのですが、ドメイン名が表示されない(読込まれない)。 Not Found The requested URL /xxx/xxx.cgi was not found on this server. になってしまいます。 読込み元のHTMLはフレームに分けてありますが、ここも問題があるのでしょうか。 そもそも外のcgiファイルはよみこめないのでしょうか、 それとも他に問題が、あるのでしょうか。 又、パーミッション、セキュリティも問題ありますか。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • レンタルサーバ、CGIモードとモジュールモードの違いについて

    初めてレンタルサーバを利用しようと思っています。 同等機能のVALUE-DOMAIN.COMかさくらインターネットどちらにしようか考えています。 http://www.value-domain.com/xrea.php http://www.sakura.ne.jp/rentalserver/matrix.html 質問ですが、PHPのCGIモード、モジュールモードの違いは何ですか? 初めて聞く言葉なので迷っています。 用途はCRON,PHP,MySQLを試す程度です。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • レンタルサーバーのアカウントのドメインの表示を取り下げたい

    お世話になっております。 example.comという独自ドメインを取得、DNSを正しく設定し、 さくらのレンタルサーバーでは、hogeというアカウントでサーバーを取得している状況で、(ドメイン・アカウント共に仮です) サイトを運営しています。 しかし、ひとつ問題がございまして、 htmlなどを作成し、ftpを使ってUPしたところ、 さくらのレンタルサーバーでの初期ドメイン hoge.sakura.ne.jp と、自分で取得した独自ドメイン example.com で、URLは違うのに全く同じ内容の表示がされてしまいます。 hoge.sakura.ne.jp にアクセスしたら自動的にexample.comのアドレスに飛ぶようにしたいと思って いるのですが、この場合どのようにしたらよいのでしょうか・・・? ※htaccessやcgiは使用可能です

  • 着うたのサンプリングレート偽装

    前に同じような質問があったのですが、 良く解らなかったので質問させていただきます。 http://ezweb.xrea.jp/bbs/mbbs.cgi?mode=form&res=4282 ↑ここに偽装方法が載ってるのですが、 「同じビットレートでサンプリングレートが違うものを作って見比べて違う所を書き換える」という事が書いてあるのですが、「違う所を書き換える」の意味がど~もわかりません。 誰か解る方いらっしゃいますかね~。

  • IF文でページ振り分けがうまく出来てない。

    CGI勉強中です。 ある掲示板CGIを改造して会員のみに使用可にしようと考えています。パスワード自体は無事組み込むことが出来たのですが、1つ問題が出ました。 掲示板なので、過去ログがありますよね。その過去ログページを表示しようとするとまた認証ページに戻ってしまい、パスワードを再度入力→最新10件のページに戻ってしまいます。どうにかして、1度入ったらパスワードを入力しなくてもいいようにしたいのですが… 今のところこうなってます。 /////////////// if ($pass_mode == '1'){ ←もしパスを使用するだったら if ($F{'mode'} eq '') { &pass_mode} ←モード無しの場合、パス入力画面に移動 if ($F{'mode'} eq 'admin') { &admin} ←モードアドミニならsub adminへ } else{ if ($F{'mode'} eq '') { &main_form} ←メイン書き込みページへ else { &{$F{'mode'}} } } /////// となっています。 また、過去ページへの移動は「**.cgi?pg=10&sort=」という感じです。 この状態で、ページ移動時にパス入力ページに移動しないようにするにはどうしたらいいでしょうか?cookieを使う必要があったりしますか? 抜けてる情報・足りない情報があったら指摘してください。すぐ補足します。言語はperlで書いています。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • フォームのアクションから引数をとる

    <form action="test.cgi?ref=5" method="post"> このような感じで、引数を送ります。 my $cgi = CGI::new(); my $ref = $cgi->param('ref'); if ($ref eq 0){ (省略) }elsif ($ref eq 5){ こんな感じでプログラムを書きました。 アドレスを見ても、ちゃんとref=5となっていますし、 普通に<a href="test.cgi?ref=1">などのリンクから飛べば、指定したifの処理に入ります。 しかし、 <form action="test.cgi?ref=5" method="post"> 上のフォームのsubmitから送ると、ref=5のifが判別されません。 どうすれば、判別してくれるのでしょうか? ご存知の方がいらっしゃいましたら、ご教授ください

    • ベストアンサー
    • CGI
  • おすすめの法人向けレンタルサーバー

    現在、xrea.comでホームページスペースとメールサーバをレンタルしています。 契約してそろそろ1年経ちますが、メールで延滞が多く、添付ファイルが送られてこないなどの障害があります。 思い切って他のレンタルサーバーへ乗り換えようと思っていますが おすすめのレンタルサーバーを教えてください。 なるべく安くといいたいところですが、まずは安定したサーバであることが条件です。 自分で調べて候補にあがっているのが ・cside.net http://2nd.cssv.jp/ 個人で以前(5~6年前)に契約していました。 ちょっと高いですがサポートは充実していると思います。 ・さくらインターネット http://www.sakura.ne.jp/ 最近耳にするレンタルサーバーですが 評価もいいようですが cside.netは外部から直接CGIにアクセスするとエラーがでたように思います。 私が挙げた2つの中から評判のよいもの また、他社で良いところがあったら教えて下さい。

専門家に質問してみよう