- ベストアンサー
文字列の比較のはずなのに・・・
「値の比較を効率よく行う方法を教えてください」で効率よい比較の方法を教えていただきましたものです。 早速試しているときに、おかしなことが・・・。 文字列が格納されている変数「$value」と「hogehoge」という文字列を比較しているのですが(本当は、もっと多く比較していますが、今は簡単にするために省略しました)、 $value eq 'hogehoge' としたときにサーバーエラーになり、 $value == 'hogehoge' としたときは、ちゃんと比較されて分岐もできています。 ??といった感じなのですが、これで正常ですか? 私としては、「数値は==」「文字列はeq」でと思っていたものですから・・・。 ご教授よろしくお願いいたします。
- qoozy257
- お礼率79% (27/34)
- Perl
- 回答数3
- ありがとう数1
- みんなの回答 (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されています。 エラーメッセージが出なくなったことに関しては、不明です。前回の書き込みをしたときから、ソースは一切いじってません。 なぞです・・・。
関連するQ&A
- 値の比較を効率よく行う方法を教えてください
最近、Perlによるプログラミングを始めました。 いろいろ学習していて不明なことがあったので、質問させていただきます。 比較による処理の分岐で、毎回比較する変数名と値は決まっています。 変数には、if文の外でforなどの処理により毎回違う値が格納されています。 このとき、何も考えずに力技で書けば if ($value eq 'aaa' || $value eq 'bbb' || $value eq 'ccc' || $value eq 'ddd' ||・・・){ # 処理 } となると思います。 これでも、処理はできるのですが、比較する値が少ないうちはいいですが、多くなったとき効率が悪いと思います。 それに、スマートではないですし・・・。 これを、効率よく処理なおかつスマートに書ける方法があれば、教えてやってください。 初心者の質問で申し訳ないですが、よろしくお願いします。
- ベストアンサー
- Perl
- DOSコマンドで結果として出力される文字列を変数に格納したい
DOSコマンドで、あるソフト(タスク)が実行されていればプログラムAを、そうでなければプログラムBを実行するバッチを組んでいます。タスクの一覧はtasklistで取得できることが分かり、対象となるタスクおみを抽出する方法も分かりました。しかし、この後どうすれば良いかが分かりません。対象となるタスクが存在した場合としない場合では出力される文字列が違います。この文字列を比較することで分岐が実現できると思ったのですが、それには文字列を変数に格納する必要があります。以下のように記述し、うまくいくことを期待したのですが、駄目でした。 set STATUS=tasklist /fi "Imagename eq タスク名" tasklist /fi "Imagename eq タスク名"の部分が関数であれば、戻り値があってそれを格納することができるのではないかと思ったのですが、できませんでした。このケースに限ったことではありませんが、各コマンドの実行結果として出力される文字列を変数に格納するにはどうすれば良いのでしょうか?VBSやWSHなどではなく、.bat形式の場合でお願いします。
- 締切済み
- Windows XP
- 文字列比較の演算子
Perl の世界から PHP にやってまいりました。 Perl では、文字列の比較には専用の演算子がありまして、 str1 eq str2 とすると、二つの文字列が同値かどうか調べられますが、PHP にはこのような演算子はないのでしょうか? www.php.net のマニュアルを見ても、そのような演算子がありません。 == 演算子が使えるものかと <?php $str1 = "this is string" ; $str2 = "this is string" if( $str1 == $str2 ) { echo "two string is same" ; } ?> などを試してみるとうまくいくようですが、www.php.net のマニュアルには「文字列を数値化して比較する」と書いてあり、本当に文字列比較が出来るか確信がもてず…。 結局、文字列を比較したいときには strcmp を呼び出していますが、これは PHP 的には正しいのでしょうか?
- ベストアンサー
- PHP
- equals() を使って、変数に入っている文字列を比較
いつも大変お世話になっております。 下記のように、変数に入った値によって条件分岐をしたいのですが、 うまくいきません・・。 どのように書くべきでしょうか。 変数aaaに入っている値がnaninaniだったら”~~~”と処理したいのですが。 if(aaa.equals("naninani")){ ~~~省略~~~ } 何卒、初心者なので途方もない質問かもしれませんが、よろしくお願いします。
- ベストアンサー
- Java
- 文字列の比較
excelvbaです。(excel2003) 3個のセル(a1,b1,c1)に文字列が入っています。 このそれぞれ文字列の右8桁を比較し、 最小の文字列が入っているセルに色を付けたいのです。 調べたら、minは使えませんし、dminがありましたが、 right(range("A1").value,8)をどう扱うかが分かりません。 出来ましたら、dminでなく他の方法が在ればベターです。 宜しくお願いします。
- 締切済み
- Excel(エクセル)
- シェルの文字列取得について
シェル(Bash)の文字列取得についてご教授ください。 文字列: test(12345) 上記の文字列から"12345"(括弧内の数値部分)を取り出し、変数へ格納する場合、どのように行えばよいのでしょうか? ちなみに1桁だったり2けただったりと数値の桁は変動します。 よろしくお願いします。
- 締切済み
- その他([技術者向] コンピューター)
- PHPの文字列の比較について
PHPの文字列の比較について質問です。 $hoge = "文字列¥¥テスト"; $foo = "文字列¥テスト"; とあった場合 var_dump($hoge == $foo); とすると trueがかえってきます。 バイト列としてみた場合 エスケープしたバックスラッシュと 構文上、エスケープの必要のないバックスラッシュの文字列上の 比較ですがこれが、なぜかtrueがかえってきます。 これは、当然の結果なのでしょうか? PHPは文字列を比較するさい、バイト列としての文字列のならびより アウトプットされる結果を比較しているということでしょうか? それとも、単純に上記変数$hogeと$fooはバスックスラッシュの使用方法は 関係なく同一のものとして扱われるのでしょうか?
- 締切済み
- PHP
- 変数の中は文字列か数値か調べたい。
タイトルのとおり、変数に代入された値が 文字列か数値か調べたいのですが、 関数、モジュール、その他の方法等ありましたら 教えてください。よろしくお願いします。
- ベストアンサー
- Perl
- UNIXで数字の文字列を、数値に変換するには?
UNIXで、数字のみの文字列を、その文字列で表される数値に変換して変数に代入したいのですが、どうすればいいでしょうか? つまり、 VALUE=`echo 22j4444j33 | awk -F'j' '{print $1}'` <VALUEに入った"22"を22の数値に変換> exit $VALUE というようなことがしたいです。 よろしくお願いします。
- ベストアンサー
- その他([技術者向] コンピューター)
- C++ 文字列変数と16進数の比較
すみません、初心者です。 char型の変数に格納されている値と16進数の値を 比較して一致したかどうか見たいのですが どのようにすればできますでしょうか? /* 16進=0x1041 (10進=4161) */ char * str = "4161"; 0x1041の16進は比較するときに直に書くとします。 このサイトで調べたら16進の値を10進に変換するような 記載もありましたが、変換してして比較すれば良いのでしょうか? やり方を記載して頂けないでしょうか。 宜しくお願いします。
- ベストアンサー
- C・C++・C#
お礼
ありがとうございました。 解決いたしました。 まさに、ご指摘の通りでした。 ちゃんと「ONX」と表示されてしまいました・・・。 ファイルから、読み込んだ際に改行コードを処理し忘れていました。以前自分で書いた別のものは、ちゃんと処理していたのに・・・。 chomp($value); と入れることによって、期待している動作になりました。 今後のいい勉強になりました。 そんな基本的なことを忘れるなと、つこっまれそうですが以後忘れることのない様に、これからもPerl使い目指して励んでいきます。 また、わからないことがあると思いますが、そのときはよろしくお願いいたします。 本当にありがとうございました。