- ベストアンサー
文字列の比較のはずなのに・・・
「値の比較を効率よく行う方法を教えてください」で効率よい比較の方法を教えていただきましたものです。 早速試しているときに、おかしなことが・・・。 文字列が格納されている変数「$value」と「hogehoge」という文字列を比較しているのですが(本当は、もっと多く比較していますが、今は簡単にするために省略しました)、 $value eq 'hogehoge' としたときにサーバーエラーになり、 $value == 'hogehoge' としたときは、ちゃんと比較されて分岐もできています。 ??といった感じなのですが、これで正常ですか? 私としては、「数値は==」「文字列はeq」でと思っていたものですから・・・。 ご教授よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
if($value eq 'ON') が成立しない原因ですが、$valueの内容が'ON'でないと考えられます。例えば、'ON△'(△は半角のスペース)等に なっていませんか。 「処理前に、printで保持している値をHTMLで吐き出して確認しました。」そうですが、空白が含まれていた場合、正しいように見える場合があります。 HTMLに吐き出す前に $value =~ s/\s/X/g; を実行してみては、いかがでしょうか。 もし、空白があれば、'ONX'のようになります。無ければ、'ON'が表示されるはずです。
その他の回答 (2)
- tatsu99
- ベストアンサー率52% (391/751)
サーバーエラーになるということは、コンパイルエラーの可能性が高いです。$value eq 'hogehoge'の「'」が正しく設定されていますか。(片方だけだとエラーになります) 一方、$value == 'hogehoge'の場合、ちゃんと比較されて分岐もできていますということですが、数値として比較した場合、数値としての評価結果が同じであれば、成立します。$value に 'aaaa' が設定されている場合、 $value == 'hogehoge' $value == 'aaaa' $value == 'bbb' は全て成立します。(数値として評価すると全て0になるため) 従って、ちゃんと比較されて分岐もできていることになります。
補足
BLUEPIXYさんに補足を書きましたが、tatsu99さんの説明でいけば「==」を使ったとき条件分岐で処理されるのは、当然ですね。 なぜ「eq」だとだめなんでしょう・・・。 他のサイトから無料のCGIを落として、試してみましたが、それではちゃんと「eq」で条件分岐できているようです。 一応、ソースをじっくり見たのですが、「'」や「;」など落としそうなものはチェックしましたし、なぜかサーバーエラーもなくなったし・・・。 不明です。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>「数値は==」「文字列はeq」 であってます。 実際の場面のコードと エラーメッセージを補足して貰えますか
補足
今再度確認したところ、サーバエラーはなくなりました。 ただ、やはり条件分岐でおかしくなっています。 コードは、 if($value eq 'ON') { push(@account,"<br><br><input type=\"submit\" value=\"完了\" name=\"SUBMIT\"> \n"); } としてます(前後は、はしょりました)。 このとき、$valueにはちゃんと ON が格納されていました。処理前に、printで保持している値をHTMLで吐き出して確認しました。 しかし、条件分岐はスルーされて、pushされません。 これが、 if($value == 'ON') { push(@account,"<br><br><input type=\"submit\" value=\"完了\" name=\"SUBMIT\"> \n"); } だとちゃんとpushされています。 エラーメッセージが出なくなったことに関しては、不明です。前回の書き込みをしたときから、ソースは一切いじってません。 なぞです・・・。
お礼
ありがとうございました。 解決いたしました。 まさに、ご指摘の通りでした。 ちゃんと「ONX」と表示されてしまいました・・・。 ファイルから、読み込んだ際に改行コードを処理し忘れていました。以前自分で書いた別のものは、ちゃんと処理していたのに・・・。 chomp($value); と入れることによって、期待している動作になりました。 今後のいい勉強になりました。 そんな基本的なことを忘れるなと、つこっまれそうですが以後忘れることのない様に、これからもPerl使い目指して励んでいきます。 また、わからないことがあると思いますが、そのときはよろしくお願いいたします。 本当にありがとうございました。