• ベストアンサー

サーバー移設に伴う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. --- どのように対処すれば良いでしょうか?

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

  • ベストアンサー
  • 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の方ではもう回答が出そうになかったので締め切りましたが、 こちらでは引き続き募集いたします。