• 締切済み

論理演算子について

論理演算に使う「or」なんですが、制御構文ifと組み合わせて以下のような使い方をしてみました。 $data01='aaa'; $data02='あああ'; $data03='test'; if ($data01 =~ m/aaa/ or $data02 =~ m/あああ/ or &data03 =~ m/test/){ 特定の処理; } このorによる論理演算ははどこまでできるのでしょうか? 上のスクリプトは問題なく動いていますが、ちょっと不安です。 専門書を見ても、orによる論理演算は<条件1 or 条件2>としか書いてなく <条件1 or 条件2 or 条件3 or ・・・>と書いても大丈夫なのでしょうか? いくつもの比較はorを使わないほうがよろしいとは思うんですが、このorが便利なのでこれで済むなら使いたいと思います。

  • Perl
  • 回答数2
  • ありがとう数2

みんなの回答

  • ysk6406
  • ベストアンサー率40% (237/589)
回答No.2

> このorによる論理演算ははどこまでできるのでしょうか? どこまででもできます。特に制限はありません。 (Perl 内部のメモリ領域等による制限はあるかも知れませんが、実質的には無制限と思って差し支えないでしょう。) > <条件1 or 条件2 or 条件3 or ・・・>と書いても大丈夫なのでしょうか? 1つの「条件」には、どのような式でも当てはめることができますので、「<条件1 or 条件2> という1つの条件」と考えれば、すっきりすると思います。 つまり、<条件1 or 条件2>を 条件1' と置き換えれば、<条件1 or 条件2 or 条件3>というのは、<条件1' or 条件3>となります。 以下、どんなに条件の数が多くなっても、同じことです。 どうもうまく説明できないのですが、おわかりいただけましたでしょうか?

noname#25358
noname#25358
回答No.1

 大丈夫です。どこまでも使えます。  特に制限はありませんし、あまり使わない方がよい、なんて話も聞いたこともありません。  俺はできるだけ「||」を使うようにしていますが、これは計算演算子「|」と区別するためです。  「or」ではこの区別がつかないので、場合によって想定とは違う動きをすることがあるかもしれませんが、デバッグをしっかりやっておけば特に問題ないかと思います。

関連するQ&A

  • 論理演算

    ビットの判定するために次のコードをしました。 if ( A And 2 = 2 ) or ( A And 4 = 4 ) Then ~ Aの論理積の結果が2か4ならばThen以下の処理の中に入っていってもらいたいのです。 ところが上記のコードでは演算式になってしまっているようで、 結果的にAが0以外ならば全てThenに入ってしまうザルコードになってしまいました。 散々つつきまわって以下のように( ) で括ればいいことが分かりました。 if (( A And 2 ) = 2 ) or (( A And 4 ) = 4 ) Then ~ ( )で括ればいいというのは分かりましたが、理由はさっぱり分かりません。 一番最初に書いたコードでも正常に見えるからです。 納得がいきませんので、どなたか説明よろしくお願い致します。

  • SQL文中の論理演算式の優先順位

    来週、初級シスアドの試験を受ける者です。 「何を今さら」と思われるかもしれませんが、参考書等に載っていなかったので質問します。 SELECT * FROM 表名 WHERE ○○○ OR △△△ AND □□□ 上記のSQL文でWHERE以下の論理演算式を解いていく場合の優先順位を教えて下さい。 問題集の解法では「△△△と□□□の論理積をだした後に○○○との論理和をだす」とありました。 また、「条件式の中の論理演算式の優先順位に注意しなさい」とありました。 この、優先順位を教えて下さい。よろしくお願いします。

  • perl 矢印演算子 -> の使い方

    -> という矢印演算子が勉強しているスクリプト中に出てきて書籍などで調べたのですが、 よく分かりませんでした。 連想配列で便利な面がある?のでしょうか? 何かを省略できる書き方ということでしょうか。 my $cgi=CGI->new; if($anct>$articleperpage){ if($cgi -> param('offset')){ $offset=$cgi->param('offset'); という具合にまだまだ続きますが、 矢印演算子が使われています。 アドバイス宜しくお願い致します。

    • ベストアンサー
    • CGI
  • COBOLの論理演算子について質問です

    長いブランクの後、不定期にCOBOLのソースを読むこともある仕事に就いた者です。 本日見た、 IF 区分1 NOT = "001" AND "002" という記述について質問致します。 区分1は3桁の数字(でも文字列)が入っているのですが、「区分1が、001かつ002でない場合」ということですよね? 何だかこれって変じゃないですか? どう変かは、うまく表現できないのですが…これだと、全ての入力レコードがELSEに流れてしまう気がします。 でも、実際はそうではありません。不思議です。 (他にも論理演算子で条件判断をしている箇所がありますので、上記のセクションの判断とは無関係なレコードもあると思います) どなたか、このモヤモヤを解決して頂けないでしょうか。

  • 論理演算

    四角ポケットの4つの角に対し、X・Y方向にそれぞれ半円形状の逃がしを入れる マクロを作成しております。 論理演算機能を用い、判断文をコンパクトにしているのですが動きがスムーズではありません。 下記に例を載せてます。 プログラムを指令値毎に作成し長文にするか、多少ぎこちなさを我慢し短文にするか どちらかになるのでしょうか?良い方法があればお願い致します。 *X方向を I(#4)、 Y方向を(#5)とし、右上の角から左回りに1・2・3・4 とします。  つまり右上のX方向に逃がしを入れる場合はメインでI1.と指令します、  ---------⊃ | | | |  --------- *左上のX方向に逃がしを入れる場合はI2.、 ⊂--------- | | | |  --------- *全ての角(X方向)に入れる場合はI1234.、 ⊂--------⊃ | | | | ⊂--------⊃ *Y方向も追加し、すべての角2*4ヶ所=8に入れたい場合は、  I1234.J1234.と指令します。 ∩ ∩    ⊂|--------|⊃ | | | |    ⊂|--------|⊃ ∪ ∪ *四角ポケット、右上角の判断文を訳付きで、、、 IF[[#4EQ1.]OR[#4EQ12.]OR[#4EQ13.]OR[#4EQ14.]OR[#4EQ123.]OR[#4EQ124.]OR[#4EQ134.]OR[#4EQ1234.]]GOTO15211 もしI数値が1.または12.または13.または14.または123.または124.または134.または1234.と等しいならN15211へ行け G1Y#18 直線切削 Y=コーナーR IF[[#5EQ1.]OR[#5EQ12.]OR[#5EQ13.]OR[#5EQ14.]OR[#5EQ123.]OR[#5EQ124.]OR[#5EQ134.]OR[#5EQ1234.]]GOTO15212 もしJ数値が1.または12.または13.または14.または123.または124.または134.または1234.と等しいならN15212へ行け G03X-#18Y#18R#18 左円弧 X=-コーナーR Y=コーナーR R=コーナーR G01X-#18 直線切削 X-=コーナーR GOTO15214 N15214へ行け N15211 G1Y[#32+#11] 直線切削 Y=[工具補正量+仕上げ代] X[#32+#11] X=[工具補正量+仕上げ代] G03Y[#18*2]R#18 左円弧Y=[コーナーR*2] R=コーナーR G01X-[#32+#11] 直線切削 X=-[工具補正量+仕上げ代] IF[[#5EQ1.]OR[#5EQ12.]OR[#5EQ13.]OR[#5EQ14.]OR[#5EQ123.]OR[#5EQ124.]OR[#5EQ134.]OR[#5EQ1234.]]GOTO15213 もしJ数値が1.または12.または13.または14.または123.または124.または134.または1234.と等しいならN15213へ行け G01X-[#18*2] 直線切削 X-=[コーナーR*2] GOTO15214 N15214へ行け N15212 G01[Y#18+#32+#11] 直線切削 Y=[コーナーR+工具補正量+仕上げ代] G03X-[#18*2]R#18 左円弧X-=[コーナーR*2] R=コーナーR G01Y-[#32+#11] 直線切削 Y=-[工具補正量+仕上げ代] X-[#32+#11] X=-[工具補正量+仕上げ代] GOTO15214 N15214へ行け N15213 G1Y[#32+#11] 直線切削 Y=[工具補正量+仕上げ代] G03X-[#18*2]R#18 左円弧X-=[コーナーR*2] R=コーナーR G01Y-[#32+#11] 直線切削 Y=-[工具補正量+仕上げ代] X-[#32+#11] X=-[工具補正量+仕上げ代] N15214 G01X-[#21-[#18*4]] 直線切削 X=-[X方向長さ-[コーナーR*4]] ; ; 単純にORの使い過ぎでしょうか。 宜しくお願いします。

  • Access演算コントロールについて

    Accessの演算コントロール(演算列)で以下を行いたいと思っております。 ■条件 (1)フラグの立っている列のみ演算対象。無い場合はnull値を返す。 (2)フラグの立っている列:次回(カレントレコード)以降、 何回目のテストで今回の平均値を上回るかを演算フィールドに返す (3)テーブル名 テストM ID 教科 点数 平均点 フラグ 演算 1 国語  45   42   0   null 2 国語  40   43   0   null 3 国語  60   80   1   4  ・・・以降4回目のテストで今回の平均値を上回る 4 国語  30   45   0   null 5 国語  55   55   1   1  ・・・次回のテストで今回の平均値を上回る 6 国語  70   47   0   null 7 国語  100   50   0   null Dlookup関数で以下のように式を書きましたが、うまく結果が求められておりません。 =IIf([演算] Is Not Null,DLookUp("[ID]","テストM","[点数] >= " & ([平均点] And "[演算)]" Is Not Null))-[ID],Null) 上記の式で演算を行うとID3のレコード演算結果が「-2」(※1-3の結果) ID5のレコード演算結果が「-4」(※1-5の結果)になります。 VBAを使ってでも解決したいと思っております。 大変恐縮ですが、どなたかアドバイスでもご教授頂けますでしょうか? よろしくお願い致します。

  • ハイパーリンク設定をご教示下さい。(演算式のどこに不備があるかが分かりません。)

    現在、Sheet1,A1に下記演算式を記入し、正しく表示されている状態ですが、ハイパーリンクの演算式を追加するとエラーが出てしまいます。 他のセルでは、同様に既存の演算式をハイパーリンクの演算式で囲むと表示もリンクも成立するのですが、書き演算式の箇所のみ演算式が成立しません。 <既存の演算式> =IF(OR(Sheet2!L1="",Sheet2!M1="",Sheet2!N1=""),"-",IF(AND(Sheet2!O1="",Sheet2!P1="",Sheet2!Q1=""),CONCATENATE(Sheet2!L1,"!"),IF(AND(Sheet2!P1="",Sheet2!$Q1=""),CONCATENATE(Sheet2!M1,"!"),IF(Sheet2!Q1="",CONCATENATE(Sheet2!M1,"!"),IF(AND(Sheet3!AM1>Sheet3!S1,Sheet3!AM1>Sheet3!V1),"○",IF(AND(Sheet2!S1<>"OK",Sheet2!S1<>""),Sheet2!S1,IF(OR(Sheet2!V1="",Sheet2!V1="OK"),"○",Sheet2!V1))))))) <ハイパーリンク設定後演算式> =HYPERLINK("#不良発生情報記入用!"&ADDRESS(ROW(),COLUMN()),(IF(OR(Sheet2!L1="",Sheet2!M1="",Sheet2!N1=""),"-",IF(AND(Sheet2!O1="",Sheet2!P1="",Sheet2!Q1=""),CONCATENATE(Sheet2!L1,"!"),IF(AND(Sheet2!P1="",Sheet2!$Q1=""),CONCATENATE(Sheet2!M1,"!"),IF(Sheet2!Q1="",CONCATENATE(Sheet2!M1,"!"),IF(AND(Sheet3!AM1>Sheet3!S1,Sheet3!AM1>Sheet3!V1),"○",IF(AND(Sheet2!S1<>"OK",Sheet2!S1<>""),Sheet2!S1,IF(OR(Sheet2!V1="",Sheet2!V1="OK"),"○",Sheet2!V1))))))))) どなたか宜しくお願い致します。

  • 論理式がうまく作れません(ノω=;)

    論理式がうまく作れません(ノω=;) 条件(1) B列にある値を D38 と比較してTRUEなら N列+P38 条件(2) B列にある値を D39 と比較してTRUEなら N列+P39 条件(3) 条件(1)・(2)どちらにも該当しなければ N列+P35 以上をIF関数で作成してみました。 =IF(COUNTBLANK(B5)=1,"",IF($D$38=B5,$P$38+N5,IF($D$39=B5,$P$39+N5,$P$35+N5))) どうしてでしょうか?『0』になってしまいます。 何かいい方法があれば教えてください。

  • VBScriptでの整数型価格データの比較演算

     VBScriptで簡単な価格比較のプログラムを作りました。文字型で価格データが格納されていて、その価格の大小を比較するものです。私は下記のように書きましたが、どうも正しく演算されていない場合があるようです。 if CDbl (Price1) < CDbl (Price2) then  比較の内容は日本円なので整数です。上記の演算がもしも適切でない場合はどのようにすれば適切かをお教え頂ければ幸いです。適切である、というご回答でも構いません。  よろしくお願いします。

  • if [ 条件式 ]とif[[ 条件式 ]]

    シェルスクリプトでのif [ 条件式 ] と if [[ 条件式 ]] の違いについて教えてください。 以下のシェルスクリプトを実行すると、 意図したとおり、111 と出力されます。 =========▼▼(ここから)▼▼========= #!/bin/sh AAA=yes if [[ "$AAA" = [yY]* ]] then echo 111 else echo 222 fi =========▲▲(ここまで)▲▲========= 上記、スクリプト3行目の if [[ "$AAA" = [yY]* ]] の部分を if [ "$AAA" = [yY]* ] というように、角カッコ 1重にすると、 エラーは発生しませんが、 222と表示されます。 if [ 条件式 ] と if [[ 条件式 ]] の違いについて教えていただけないでしょうか。

専門家に質問してみよう