Perl 演算子

演算子は、コンパイラに特定の数学的または論理的操作を実行するように指示する記号です。例: 3+2=5。

Perl 言語には豊富な演算子が組み込まれており、よく使われるいくつかを見てみましょう:


算術演算子

表の例では、変数 $a を 10、$b を 20 に設定しています。

演算子 説明 例
+ 加算演算 $a + $b の結果は 30
- 減算演算 $a - $b の結果は -10
* 乗算演算 $a * $b の結果は 200
/ 除算演算 $b / $a の結果は 2
% 剰余演算、除算後の余り $b % $a の結果は 0
** べき乗$a**$b の結果は 10 の 20 乗

例

#!/usr/bin/perl $a = 10; $b = 20; print "\$a = $a , \$b = $b\n"; $c = $a + $b; print '$a + $b = ' . $c . "\n"; $c = $a - $b; print '$a - $b = ' . $c . "\n"; $c = $a * $b; print '$a * $b = ' . $c . "\n"; $c = $a / $b; print '$a / $b = ' . $c . "\n"; $c = $a % $b; print '$a % $b = ' . $c. "\n"; $a = 2; $b = 4; $c = $a ** $b; print '$a ** $b = ' . $c . "\n";

上記のプログラムの実行出力結果は次のとおりです:

$a = 10 , $b = 20
$a + $b = 30
$a - $b = -10
$a * $b = 200
$a / $b = 0.5
$a % $b = 10
$a ** $b = 16

比較演算子

表の例では、変数 $a を 10、$b を 20 に設定しています。

演算子 説明 例
== 2つのオペランドの値が等しいかどうかを確認し、等しければ条件は true、それ以外は false です。 ($a == $b) は false
!= 2つのオペランドの値が等しいかどうかを確認し、等しくなければ条件は true、それ以外は false です。 ($a != $b) は true。
<=> 2つのオペランドの値を比較し、左の数が右の数より小さい場合は -1、等しい場合は 0、左の数が右の数より大きい場合は 1 を返します。 ($a <=> $b) は -1 を返します。
> 左オペランドの値が右オペランドの値より大きいかどうかを確認し、そうであれば条件は true、それ以外は false です。 ($a > $b) は false を返します。
< 左オペランドの値が右オペランドの値より小さいかどうかを確認し、そうであれば条件は true、それ以外は false を返します。 ($a < $b) は true を返します。
>= 左オペランドの値が右オペランドの値以上かどうかを確認し、そうであれば条件は true、それ以外は false を返します。 ($a >= $b) は false を返します。
<= 左オペランドの値が右オペランドの値以下かどうかを確認し、そうであれば条件は true、それ以外は false を返します。 ($a <= $b) は true を返します。

例

#!/usr/bin/perl $a = 10; $b = 20; print "\$a = $a , \$b = $b\n"; if( $a == $b ){ print "$a == \$b 結果 true\n"; }else{ print "\$a == \$b 結果 false\n"; } if( $a != $b ){ print "\$a != \$b 結果 true\n"; }else{ print "\$a != \$b 結果 false\n"; } $c = $a <=> $b; print "\$a <=> \$b 戻り値$c\n"; if( $a > $b ){ print "\$a > \$b 結果 true\n"; }else{ print "\$a > \$b 結果 false\n"; } if( $a >= $b ){ print "\$a >= \$b 結果 true\n"; }else{ print "\$a >= \$b 結果 false\n"; } if( $a < $b ){ print "\$a < \$b 結果 true\n"; }else{ print "\$a < \$b 結果 false\n"; } if( $a <= $b ){ print "\$a <= \$b 結果 true\n"; }else{ print "\$a <= \$b 結果 false\n"; }

上記のプログラムの実行出力結果は次のとおりです:

$a = 10 , $b = 20
$a == $b 结果 false
$a != $b 结果 true
$a <=> $b 返回 -1
$a > $b 结果 false
$a >= $b 结果 false
$a < $b 结果 true
$a <= $b 结果 true

次の表の例では、変数 $a を "abc"、$b を "xyz" に設定し、比較演算子を使って結果を計算します。

演算子 説明 例
lt 左の文字列が右の文字列より小さいかどうかを確認し、そうであれば true を返し、それ以外は false を返します。 ($a lt $b) は true を返します。
gt 左の文字列が右の文字列より大きいかどうかを確認し、そうであれば true を返し、それ以外は false を返します。 ($a gt $b) は false を返します。
le 左の文字列が右の文字列以下かどうかを確認し、そうであれば true を返し、それ以外は false を返します。 ($a le $b) は true を返します。
ge 左の文字列が右の文字列以上かどうかを確認し、そうであれば true を返し、それ以外は false を返します。 ($a ge $b) は false を返します。
eq 左の文字列が右の文字列と等しいかどうかを確認し、そうであれば true を返し、それ以外は false を返します。 ($a eq $b) は false を返します。
ne 左の文字列が右の文字列と等しくないかどうかを確認し、そうであれば true を返し、それ以外は false を返します。 ($a ne $b) は true を返します。
cmp 左の文字列が右の文字列より大きい場合は 1 を返し、等しい場合は 0 を返し、左の文字列が右の文字列より小さい場合は -1 を返します。 ($a cmp $b) は -1 を返します。

例

#!/usr/bin/perl $a = "abc"; $b = "xyz"; print "\$a = $a ,\$b = $b\n"; if( $a lt $b ){ print "$a lt \$b 戻り値 true\n"; }else{ print "\$a lt \$b 戻り値 false\n"; } if( $a gt $b ){ print "\$a gt \$b 戻り値 true\n"; }else{ print "\$a gt \$b 戻り値 false\n"; } if( $a le $b ){ print "\$a le \$b 戻り値 true\n"; }else{ print "\$a le \$b 戻り値 false\n"; } if( $a ge $b ){ print "\$a ge \$b 戻り値 true\n"; }else{ print "\$a ge \$b 戻り値 false\n"; } if( $a ne $b ){ print "\$a ne \$b 戻り値 true\n"; }else{ print "\$a ne \$b 戻り値 false\n"; } $c = $a cmp $b; print "\$a cmp \$b 戻り値$c\n";

上記のプログラムの実行出力結果は次のとおりです:

$a = abc ,$b = xyz
abc lt $b 返回 true
$a gt $b 返回 false
$a le $b 返回 true
$a ge $b 返回 false
$a ne $b 返回 true
$a cmp $b 返回 -1

代入演算子

表の例では、変数 $a を 10、$b を 20 に設定しています。

演算子 説明 例
= 単純な代入演算子。右のオペランドの値を左のオペランドに代入します。 $c = $a + $b は $a + $b の値を $c に代入します。
+= 加算代入演算子。右のオペランドと左のオペランドを加算した結果を左のオペランドに代入します。 $c += $a は $c = $c + $a と同じです。
-= 減算代入演算子。左のオペランドから右のオペランドを減算した結果を左のオペランドに代入します。 $c -= $a は $c = $c - $a と同じです。
*= 乗算代入演算子。右のオペランドと左のオペランドを乗算した結果を左のオペランドに代入します。 $c *= $a は $c = $c * $a と同じです。
/= 除算代入演算子。左のオペランドを右のオペランドで除算した結果を左のオペランドに代入します。 $c /= $a は $c = $c / $a と同じです。
%= 剰余代入演算子。2つのオペランドの剰余を求め、左のオペランドに代入します。 $c %= $a は $c = $c % a と同じです。
**= べき乗代入演算子。2つのオペランドのべき乗を求め、左のオペランドに代入します。 $c **= $a は $c = $c ** $a と同じです。

例

#!/usr/bin/perl $a = 10; $b = 20; print "\$a = $a ,\$b = $b\n"; $c = $a + $b; print "代入後\$c = $c\n"; $c += $a; print "\$c = $c、演算文\$c += \$a\n"; $c -= $a; print "\$c = $c、演算文\$c -= \$a\n"; $c *= $a; print "\$c = $c、演算文\$c *= \$a\n"; $c /= $a; print "\$c = $c 、演算文 \$c/= \$a\n"; $c %= $a; print "\$c = $c、演算文 \$c %= \$a\n"; $c = 2; $a = 4; print "\$a = $a , \$c = $c\n"; $c **= $a; print "\$c = $c、演算文 \$c **= \$a\n";

上記のプログラムの実行出力結果は次のとおりです:

$a = 10 ,$b = 20
赋值后 $c = 30
$c = 40 ,运算语句 $c += $a
$c = 30 ,运算语句 $c -= $a
$c = 300 ,运算语句 $c *= $a
$c = 30 ,运算语句 $c /= $a
$c = 0 ,运算语句 $c %= $a
$a = 4 , $c = 2
$c = 16 ,运算语句 $c **= $a

ビット演算

ビット演算子はビットに対して作用し、ビット単位で操作を実行します。

$a = 60、$b = 13 を設定します。バイナリ形式で表すと、次のようになります:

$a = 0011 1100

$b = 0000 1101

-----------------

$a&$b = 0000 1100

$a|$b = 0011 1101

$a^$b = 0011 0001

~$a  = 1100 0011

Perl がサポートするビット演算子は次の表のとおりです:

演算子 説明 例
& 両方のオペランドに存在する場合、バイナリ AND 演算子は1ビットを結果にコピーします。 ($a & $b) は 12 になります。バイナリでは 0000 1100 です。
| いずれかのオペランドに存在する場合、バイナリ OR 演算子は1ビットを結果にコピーします。 ($a | $b) は 61 になり、2進数では 0011 1101 です。
^ いずれか一方のオペランドには存在するが、両方には存在しない場合、バイナリXOR演算子は1ビットを結果にコピーします。 ($a ^ $b) は 49 になり、2進数では 0011 0001 です。
~ バイナリ反転演算子は単項演算子で、ビットを「反転」する効果があります。つまり0は1に、1は0になります。 (~$a ) は -61 になり、2進数では 1100 0011 で、符号付き2進数の反転形式です。
<< バイナリ左シフト演算子。左オペランドの値を右オペランドで指定されたビット数だけ左にシフトします。 $a << 2 は 240 になり、2進数では 1111 0000 です。
>> バイナリ右シフト演算子。左オペランドの値を右オペランドで指定されたビット数だけ右にシフトします。 $a >> 2 は 15 になり、2進数では 0000 1111 です。

例

#!/usr/bin/perl use integer; $a = 60; $b = 13; print "\$a = $a , \$b = $b\n"; $c = $a & $b; print "\$a & \$b = $c\n"; $c = $a | $b; print "\$a | \$b = $c\n"; $c = $a ^ $b; print "\$a ^ \$b = $c\n"; $c = ~$a; print "~\$a = $c\n"; $c = $a << 2; print "\$a << 2 = $c\n"; $c = $a >> 2; print "\$a >> 2 = $c\n";

上記のプログラムを実行すると、出力結果は次のようになります:

$a = 60 , $b = 13
$a & $b = 12
$a | $b = 61
$a ^ $b = 49
~$a = -61
$a << 2 = 240
$a >> 2 = 15

論理演算子

Perl の論理演算子は次の表のとおりです。

表の例では、変数 $a を true、$b を false に設定しています。

演算子 説明 例
and 論理積演算子。両方のオペランドが true の場合、条件は true になります。 ($a and $b) は false です。
&& C スタイルの論理積演算子。両方のオペランドが true の場合、条件は true になります。 ($a && $b) は false です。
or 論理和演算子。2つのオペランドのいずれかがゼロでない場合、条件は true になります。 ($a or $b) は true です。
|| C スタイルの論理和演算子。2つのオペランドのいずれかがゼロでない場合、条件は true になります。 ($a || $b) は true です。
not 論理否定演算子。オペランドの論理状態を反転するために使います。条件が true の場合、論理否定演算子は false にします。 not($a and $b) は true です。

例

#!/usr/bin/perl $a = true; $b = false; print "\$a = $a , \$b = $b\n"; $c = ($a and $b); print "\$a and \$b = $c\n"; $c = ($a && $b); print "\$a && \$b = $c\n"; $c = ($a or $b); print "\$a or \$b = $c\n"; $c = ($a || $b); print "\$a || \$b = $c\n"; $a = 0; $c = not($a); print "not(\$a)= $c\n";

上記のプログラムを実行すると、出力結果は次のようになります:

$a = true , $b = false
$a and $b = false
$a && $b = false
$a or $b = true
$a || $b = true
not($a)= 1

クォート演算

Perl のクォート演算子は次の表のとおりです。

演算子 説明 例
q{ } 文字列に単一引用符を追加します。 q{abcd} の結果は 'abcd' です。
qq{ } 文字列に二重引用符を追加します。 qq{abcd} の結果は "abcd" です。
qx{ } 文字列にバッククォートを追加します。 qx{abcd} の結果は `abcd` です。

例

#!/usr/bin/perl $a = 10; $b = q{a = $a}; print "q{a = \$a} = $b\n"; $b = qq{a = $a}; print "qq{a = \$a} = $b\n"; # unix の date コマンドを使用して実行 $t = qx{date}; print "qx{date} = $t\n";

上記のプログラムを実行すると、出力結果は次のようになります:

q{a = $a} = a = $a
qq{a = $a} = a = 10
qx{date} = 2016年 6月10日 星期五 16时22分33秒 CST

その他の演算子

上記で説明した演算子の他に、Perl は以下の演算子もサポートしています:

演算子 説明 例
. ドット (.) は2つの文字列を連結するために使います。 $a="run"、$b="oob" の場合、$a.$b の結果は "サンプル" です。
x x 演算子は文字列を繰り返した回数を返します。 ('-' x 3) の出力は --- です。
.. .. は範囲演算子です。 (2..5) の出力結果は (2, 3, 4, 5) です。
++ インクリメント演算子。整数値を1増やします。 $a =10、$a++ の出力は 11 です。
-- デクリメント演算子。整数値を1減らします。 $a =10、$a-- の出力は 9 です。
-> アローはクラスのメソッドを指定するために使います。$obj->$a はオブジェクト $obj の $a メソッドを表します。

例

#!/usr/bin/perl $a = "run"; $b = "oob"; print "\$a = $a , \$b = $b\n"; $c = $a . $b; print "\$a . \$b = $c\n"; $c = "-" x 3; print "\"-\" x 3 = $c\n"; @c = (2..5); print "(2..5) = @c\n"; $a = 10; $b = 15; print "\$a = $a , \$b = $b\n"; $a++; $c = $a ; print "\$a 実行\$a++ = $c\n"; $b--; $c = $b ; print "\$b 実行\$b-- = $c\n";

上記のプログラムを実行すると、出力結果は次のようになります:

$a  = run , $b = oob
$a . $b = サンプル
"-" x 3 = ---
(2..5) = 2 3 4 5
$a  = 10 , $b = 15
$a 执行 $a++ = 11
$b 执行 $b-- = 14

演算子の優先順位

次の表は Perl 言語の演算子の優先順位を示しています:

演算子結合性
++, --无
-, ~, !右から左
**右から左
=~, !~左から右
*, /, %, x左から右
+, -, .左から右
<<, >>左から右
-e, -r,无
<, <=, >, >=, lt, le, gt, ge左から右
==, !=, <=>, eq, ne, cmp左から右
&左から右
|, ^左から右
&&左から右
||左から右
..左から右
? and :右から左
=, +=, -=, *=,右から左
その他
,左から右
not左から右
and左から右
or, xor左から右

例

#!/usr/bin/perl $a = 20; $b = 10; $c = 15; $d = 5; $e; print "\$a = $a, \$b = $b, \$c = $c ,\$d = $d\n"; $e = ($a + $b) * $c / $d; print "(\$a + \$b) * \$c / \$d = $e\n"; $e = (($a + $b) * $c )/ $d; print "((\$a + \$b) * \$c) / \$d = $e\n"; $e = ($a + $b) * ($c / $d); print "(\$a + \$b) * (\$c / \$d ) = $e\n"; $e = $a + ($b * $c ) / $d; print "\$a + (\$b * \$c )/ \$d = $e\n";

上記のプログラムを実行すると、出力結果は次のようになります:

$a  = 20, $b = 10, $c = 15 ,$d = 5
($a + $b) * $c / $d  = 90
(($a + $b) * $c) / $d  = 90
($a + $b) * ($c / $d )  = 90
$a + ($b * $c )/ $d  = 50
その他の拡張