Perlの論理演算子
Perlの論理演算子には次のものがあります。
演算子 | 意味 |
---|---|
|| | 論理和 |
&& | 論理積 |
! | 否定 |
or | 論理和(&&より優先順位が低い) |
and | 論理積&&より優先順位が低い) |
not | 否定(!より優先優位が低い) |
&& 論理積(A かつ B)
「AかつB」という論理積を表すには&&を使用します。
# 1より大きい、かつ4より小さい if ($num > 1 && $num < 4) { ... }
|| 論理和(A または B)
「AまたはB」という論理積を表すには||を使用します。少なくともどちらかひとつの値が真の場合に、真になります。
# 'dog'または'cat' if ($pet eq 'dog' || $pet eq 'cat') { print "\$pet は、'dog' あるいは、'cat' のどちらかである。\n\n"; }
! 否定(Aでない)
「Aではない」という否定を表すには!を使用します。
# $numは真ではない if (!$num) { ... }
and 論理積(A かつ B) 優先順位低い
「AかつB」という論理積を表すのにandを使用することもできます。優先順位は「&&」より小さくなっています。論理積には「&&」を使うのがお勧めです。「and」は以下で解説する条件分岐に利用することができます。
# 1より大きい、かつ4より小さい if ($num > 1 and $num < 4) { ... }
or 論理和(A または B) 優先順位低い
「AまたはB」という論理積を表すのにorを使用することもできます。優先順位は「||」より小さくなっています。論理和には「||」を使うのがお勧めです。「or」は以下で解説する条件分岐に利用することができます。
# 'dog'または'cat' if ($pet eq 'dog' or $pet eq 'cat') { print "\$pet は、'dog' あるいは、'cat' のどちらかである。\n\n"; }
not 否定(Aでない) 優先順位低い
「Aではない」という否定を表すのにnotを使用することもできます。優先順位は「!」よりも小さくなっています。否定には「not」ではなく「!」を使うのがお勧めです。
# $numは真ではない if (not $num) { ... }
論理演算子の一般的な使われ方
if文、unless文、while文、for文の中で使う場合は、「&&」「||」「!」を使うのがPerlの慣習になっています。and、notは使われることが少ないです。
# 論理演算子 if ($var1 && $var2 || $var3) { ... }
「&&」は「||」よりも優先順位が高いです。優先順位を変えたい場合は括弧「()」を使用します。
if ($var1 && ($var2 || $var3)) { ... }
Perlの論理演算子の評価の特徴
Perlの論理演算子は評価が決定した時点で評価をやめます。たとえば
$var1 && $var2
という条件があった場合、$var1が偽であれば「$var1 && $var2」は偽になることが決定するのでそこで評価は終わります。
$var1 || $var2
という条件があった場合は、$var1が真であれば「$var1 || $var2」は真になることが決定するのでそこで評価は終わります。
orを条件分岐として使う
このような性質を利用してorは条件分岐に使われることが多いです。たとえばopen関数が失敗した場合は次のように記述します。
open my $fh, '<', $file or die qq/Can't open file "$file": $!/;
open関数が成功した場合は真が返されるのでorの右辺は実行されません。open関数が失敗した場合はundefが返されるので右辺のdieが実行されプログラムは終了します。
もうひとつの例として、system関数と一緒に使われることもあります。system関数は成功すると0を返すので、次のように記述します。
system(@cmd) == 0 or die "Can't execute command @cmd";
主要な処理を先に記述して、補足的なエラー処理を後で書きたい場合に、orによる条件分岐を使うことができます。
「and」を条件分岐に使うこともできますが、読みにくいので「or」をお勧めします。
# andで書き換えた例 system(@cmd) and die "Can't execute command @cmd";
サンプルプログラム
論理積、論理和、否定のサンプルです。
use strict; use warnings; # 論理積、論理和、否定 print "1. 論理積( A かつ B )\n"; my $num = 3; if ($num > 1 && $num < 4) { print "\$numは、1より大きく、4より小さい\n\n"; } print "2. 論理和( A または B )\n"; my $pet = 'dog'; if ($pet eq 'dog' || $pet eq 'cat') { print "\$pet は、'dog' あるいは、'cat' のどちらかである。\n\n"; } print "3. 否定( Aでない )\n"; my $num0 = 0; if (!$num0) { print "!\$num は、真\n"; }