論理演算子

関係演算子を使えば簡単な条件判断は可能ですが、論理演算子を使うことで「a と bが等しい」且つ「c は dよりも大きい」などの複数の条件式を組み合わせたより複雑な条件式を記述することができます。ここでは Perl における論理演算子の利用方法について解説します。

(Last modified: )

論理演算子の種類

論理演算子には次のようなものが用意されています。

演算子名前記述例意味
&&論理積 ANDa && baとbが共に真の場合に真
||論理和 ORa || baかbの少なくとも1つが真の場合に真
!否定 NOT!aaが真の時に偽、偽の時に真

論理積の場合は左辺及び右辺がどちらも真となる場合に全体として真を返します。論理和の場合は左辺又は右辺の少なくともどちらか 1 つが真の場合に全体として真を返します。否定は右辺が真なら偽を、偽なら真を返します。

このように論理演算子は真か偽かだけを見ていますので、左辺又は右辺には関係演算子を使った条件式などを記述し、組み合わせて使用することになります。

論理積

論理積(AND)は演算子の左辺及び右辺の条件式が共に真の場合のみ全体の評価が真となります。演算子は && です。

左辺右辺全体

例えば次のように使用します。

my $old;

$old = 24;

if ($old >= 20 && $old < 30){
  print "20代です\n";
}

左辺の条件式である変数 $old に格納されている値が 20 以上かどうかを評価します。結果は真(true)です。次に右辺の条件式である変数 $old に格納されている値が 30 より小さいかどうかを評価します。結果は真(true)です。最後に && 演算子の左辺と右辺を評価し、どちらも真(true)ですので全体の条件式も真(true)となります。(なぜ && 演算子が最後に評価されるのかは演算子の優先順位が低いためです)。

論理積の場合はまず左辺の値をみます。左辺が真の場合のみ今度は右辺の値を確認します。もし左辺が偽の場合は右側の値を確認しません。なぜならば論理積の場合は左辺及び右辺の両方が真の場合のみ真となりますので左辺が偽であった場合は右辺を確認する必要がないためです。

この左側が偽なら右側は確認しないという特性を利用したプログラムが記述されることがあります。よく使われるような記述方法はまた別のページで確認します。

論理和

論理和(OR)は演算子の右辺か左辺のどちらかの条件式が真の場合に全体の評価が真となります。演算子は || です。

左辺右辺全体

例えば次のように使用します。

my ($kokugo, $sansu);

$kokugo = 58;
$sansu = 75;

if ($kokugo >= 60 || $sansu >= 60){
  print "合格です\n";
}

左辺の条件式である変数 $kokugo に格納されている値が 60 以上かどうかを評価します。結果は偽(false)です。次に右辺の条件式である変数 $sansu に格納されている値が 60 以上かどうかを評価します。結果は真(true)です。最後に || 演算子の左辺と右辺を評価し、少なくともどちらか 1 つが真(true)ですので全体の条件式も真(true)となります。

論理和の場合はまず左辺の値をみます。左辺が真の場合には右辺の値を確認しません。左辺が偽の場合だけ右側の値を確認します。なぜならば論理和の場合は左辺及び右辺の少なくともどちらかが真の場合は真となりますので左辺が真であった場合は右辺を確認する必要がないためです。

論理積の場合と同じく論理和の場合に左側が真なら右側は確認しないという特性を利用したプログラムが記述されることがあります。よく使われるような記述方法はまた別のページで確認します。

否定

否定(NOT)は演算子の右辺の条件式が真の場合に全体の評価が真となり、右辺の条件式が偽の場合に全体の評価が偽となります。演算子は ! です。

右辺全体

例えば次のように使用します。

my $seibetu;

$seibetu = "男性";

if (!($seibetu eq "女性")){
  print "女性ではありません\n";
}

まず $seibetu eq "女性" が真か偽かを評価します。結果は偽(false)です。それに対して ! 演算子を評価するので真(true)となります。

否定を使う場合には演算子の優先順位に注意して下さい。 && 演算子や || 演算子は優先順位が比較的低いので次のように記述しても意図した通りの動作をします。

my ($kokugo, $sansu);

$kokugo = 58;
$sansu = 75;

if ($kokugo >= 60 || $sansu >= 60){
  print "合格です\n";
}

それに対して ! 演算子は優先順位が == 演算子や < 演算子よりも高いので次のように記述すると先に否定が行われます。

my $seibetu;

$seibetu = "男性";

if (!$seibetu eq "女性"){
  print "女性ではありません\n";
}

この場合は先に ! 演算子が評価され、その後で == 演算子が評価されてしまいます。その為、否定を使う場合は次のように括弧 () を使って優先順位を変更する必要があります。

my $seibetu;

$seibetu = "男性";

if (!($seibetu eq "女性")){
  print "女性ではありません\n";
}
サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my $old;

$old = 24;
if ($old >= 20 && $old < 30){
  print "20代です\n";
}

my $kokugo;
my $sansu;

$kokugo = 58;
$sansu = 75;

if ($kokugo >= 60 || $sansu >= 60){
  print "合格です\n";
}

my $seibetu;

$seibetu = "男性";
if (!($seibetu eq "女性")){
  print "女性ではありません\n";
}

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

論理演算子(1)

色々な論理演算子を使って数値や文字列の比較をしました。

-- --

Perl における論理演算子の利用方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。