§2.3 演算子


作成日:2001/06/21(木)
最終更新日:2001/07/29(日)

「演算子」とは、1つあるいは複数の引数(オペランド)を受け取って、決められた操作を行い、得られた結果を返すものです。 演算子には、算数や数学でおなじみの算術演算子、文字列の引数を取る文字列演算子、代入演算子などがあります。 ここではいくつかの基本的な演算子を紹介します。

算術演算子

算数でおなじみの種々の演算子です。

名前 用法と結果
加算(+) 4+6 (結果は10)
減算(-) 6-4 (結果は2)
乗算(*) 4*6 (結果は24)
除算(/) 12/4 (結果は3)
6/4 (結果は1.5)
べき乗(**) 2**3 (2の3乗で結果は8)
剰余(%) 20%6 (20を6で割った余りで結果は2)

どれもおなじみの演算子ですね。 これらの演算子の引数としてはスカラー変数の値を使うことも出来ます。 例えば、

 $x = 5;
 $y = 8;
 $z = $x + $y;

とすると$zには5+8、つまり13が代入されます。 また、剰余演算子の引数に小数が入っていると、小数点以下を切り捨てて計算します。 ですから、

 20.5 % 6.2

とすると、まず20.5を20に、6.2を6に変換してから余りを計算します。 ですから結果は2となります。

文字列演算子

この節の冒頭でも書きましたように、文字列演算子は文字列を引数(オペランド)にとります。 ここでは2つ、文字列連結演算子(.)と繰り返し演算子(x)を紹介します。
 まず文字列連結演算子(.)はその名のとおり、2つの文字列をつなげます。

 $word1 = "supercalifragilistic";
 $word2 = "expialidocious!!";
 $word = $word1 . $word2;

とすると、$wordにはsupercalifragilisticexpialidocious!!がセットされます。
 次に繰り返し演算子(x)は、左オペランド(演算子の左側にあるオペランド)の文字列を、右オペランドにある回数だけ繰り返します。

 $kaeru = 'けろ' x 2;  #$kaeruに「けろけろ」がセットされる

代入演算子と2項代入演算子

代入演算子=はもうおなじみですね。

 $a = 3;  #$aに3を代入

Perlでは、1つの式の中に複数の代入演算子を使うことも出来ます。

 $a = $b = 123;  #$aにも$bにも123を代入

また、第1章で

 $i = $i + 1;

という式を何度か見てきました。 これは、$iの現在の値に1を加えて、それをまた$iに代入するという意味を持っていました。つまり$iの値を1増やすということです。 こういう操作は結構頻繁に行われますが、そのたびに同じ変数名を書くのは面倒なので、Perlは次のような書き方を用意しています。

 $i += 1;

加算演算子や減算演算子など、2つのオペランドを取る演算子のことを一般に2項演算子といいますが、Perlはたいていの2項演算子に対して、このような書き方を用意しています。 これらを2項代入演算子といいます。

 $j -= 3;
 #$j = $j - 3;と同じ

 $k *= 4;
 #$k = $k * 4;と同じ

 $l /= 5;
 #$l = $l / 5;と同じ

 $m .= "<br>";
 #$m = $m . "<br>";と同じ

 $kaeru x= 4;
 #$kaeruに「けろけろけろけろ」をセット

インクリメント、デクリメント演算子

上で紹介した2項代入演算子のうち、

 $i += 1;
 $i -= 1;

については本当にしょっちゅう使うので、もっと便利な書き方を用意しています。 それは、

 $i++;  #$i += 1;と同じ
 $i--;  #$i -= 1;と同じ

の2つです。 それぞれインクリメント、デクリメント演算子といいます。 この2つは置く場所によって結果が違ってくるという面白い演算子です。 次の例を見てください。

 $value = 10;
 $new_value = $value++;

++は引数である$valueの後にあります。 この場合、$new_valueに値を代入してから$valueの値を1増やします。 よって$valueの値は11、$new_valueの値は10になります。 これに対し、

 $value = 10;
 $new_value = ++$value;

とすると、$valueの値をインクリメントしてから$new_valueに値を代入します。 ですから$valueの値も$new_valueの値も11になります。 これはデクリメント演算子に付いても言えることです。わかります?

演算子の優先順位と結合

小学校のときの算数の時間に「掛け算や割り算は足し算、引き算よりも先に計算しましょう。 もし足し算や引き算を先に計算したいのならば( )でくくりましょう。」と習いましたね。 覚えてますか? 実はこれと同じことがPerlにも言えるのです。 算術演算子だけでなく、Perlのさまざまな演算子に対して「優先順位」と言うものがあるのです。 また、

 5 ** 2 ** 3;

とした場合、右と左、どちらのべき乗演算子から実行されるのでしょうか? このように、優先順位が等しい演算子が並んだときに、どちらを先に実行するかを決めているのが結合側です。 上の場合、**演算子は右の物から実行される(これを「右結合」といいます)ので、上の計算結果は5**8となります。 もし**演算子が左結合ならば上の結果は25**3となってしまいます。
 下の表は、演算子の優先順位と結合を表した物です。 表の上にある演算子ほど、優先順位が高くなります。

演算子 結合
項、
リスト演算子(左方向に対して)
左結合
-> 左結合
++, -- 非結合
** 右結合
!, ~, \,単項の+, 単項の- 右結合
=~, !~ 左結合
*, /, %, x 左結合
*, -, . 左結合
<<, >> 左結合
名前つき単項演算子 非結合
<, >, <=, >=, lt, gt, le, ge 非結合
==, !=, <=>, eq, ne, cmp 非結合
& 左結合
|, ^ 左結合
&& 左結合
|| 左結合
.. 非結合
?: 右結合
=, *=, +=, -=等の代入演算子 右結合
,, => 左結合
リスト演算子(右方向に対して) 非結合
not 右結合
and 左結合
or, xor 左結合

上の表の1番上にある「項」とは、変数、クォート、クォート風演算子(q//, qq//等)、()で囲んだ式、( )で引数を囲んだ関数などのことです。

さていくつか演算子を見てきました。 Perlには他にも比較演算子や論理演算子などさまざまな演算子が用意されています。 これらの働きについてはまた後ほど説明していきます。 まずはこの節で扱った演算子について、いろいろと実験をしてみてください。 「実験と思考錯誤」こそ、Perl職人への道なのです。
 これで第2章はおしまいです。 第3章では2つ目のデータ型、リストと配列について見ていこうと思います。


「§2.2 スカラー変数」へ 「§3.1 リストと配列」へ
ソフトバンク パブリッシング株式会社

Copyright (C) can All Rights Reserved
e-mail:ishiki@mrj.biglobe.ne.jp