Perlの哲学 - Perlに対する誤解を解く

Perlの演算子とC言語の演算子は、種類が似ていて、優先順位が同じ

Perlの演算子とC言語の演算子は、種類が似ていて、演算子の優先順位が同じです。

Perlの演算子

Perlの演算子です。C言語の演算子と同じものと、機能が似ているものを取り上げました。加算演算子、減算演算子、減算演算子、減算演算子、剰余演算子、インクリメント/デクリメントなどの算術演算子、数値比較演算子、論理演算子、単項演算子、シフト演算子、アロー演算子、3項演算子を取り上げています。

# 加算演算子
my $ret = $x + $y;

# 減算演算子
my $ret = $x - $y;

# 減算演算子
my $ret = $x * $y;

# 減算演算子
my $ret = $x / $y;

# 剰余演算子
my $ret = $x % $y;

# インクリメント/デクリメント
my $ret = ++$x;
my $ret = $x++;
my $ret = --$x;
my $ret = $x--;

# 数値の比較演算子
my $ret = $x > $y;
my $ret = $x >= $y;
my $ret = $x < $y;
my $ret = $x <= $y;
my $ret = $x == $y;
my $ret = $x != $y;

# 論理演算子
my $ret = $x && $y;
my $ret = $x || $y;
my $ret = !$x;

# 単項演算子
my $ret = +$x;
my $ret = -$x;

# 右シフト演算子
my $ret = $x << $y;

# 左シフト演算子
my $ret = $x >> $y;

# 代入演算子
my $ret = $x;
my $ret += $x;
my $ret -= $x;
my $ret *= $x;
my $ret /= $x;
my $ret %= $x;
my $ret >>= $x;
my $ret <<= $x;

# アロー演算子
my $ret = $foo->{x};

# もしアクセッサを定義すれば、上記は以下のように書ける
my $ret = $foo->x;

# 3項演算子
my $ret = $flag ? $x : $y;

C言語の演算子

C言語の演算子です。加算演算子、減算演算子、減算演算子、減算演算子、剰余演算子、インクリメント/デクリメントなどの算術演算子、数値比較演算子、論理演算子、単項演算子、シフト演算子、アロー演算子、3項演算子を取り上げています。

// 加算演算子
int32_t ret = x + y;

// 減算演算子
int32_t ret = x - y;

// 乗算演算子
int32_t ret = x * y;

// 除算演算子
int32_t ret = x / y;

// 剰余演算子
int32_t ret = x % y;

// インクリメント/デクリメント
int32_t ret = ++x;
int32_t ret = x++;
int32_t ret = --x;
int32_t ret = x--;

// 数値の比較演算子
int32_t ret = x > y;
int32_t ret = x >= y;
int32_t ret = x < y;
int32_t ret = x <= y;
int32_t ret = x == y;
int32_t ret = x != y;

// 論理演算子
int32_t ret = x && y;
int32_t ret = x || y;
int32_t ret = !x;

// 単項演算子
int32_t ret = +x;
int32_t ret = -x;

// 右シフト演算子
int32_t ret = x << y;

// 左シフト演算子
int32_t ret = x >> y;

// 代入演算子
int32_t ret = x;
int32_t ret += x;
int32_t ret -= x;
int32_t ret *= x;
int32_t ret /= x;
int32_t ret %= x;
int32_t ret >>= x;
int32_t ret <<= x;

// アロー演算子
int32_t ret = foo->x;

// 3項演算子
int32_t ret = flag ? x : y;

Perlの演算子とC言語の演算子の比較

Perlの演算子の数値演算子、数値の比較演算子、単項演算子、論理演算子、シフト演算子、インクリメント/デクリメント、代入演算子、3項演算子は、C言語と機能が同じです。

代入演算子は、式を返すという点でもC言語と同じです。代入文ではなく、代入式として評価されます。

Perlのアロー演算子は、参照を通してフィールドにアクセスできるという点がC言語と似ています。

アクセッサと呼ばれる、フィールドにアクセスするための、メソッドを定義してやると、Perlのフィールドアクセスと、C言語のフィールドアクセスは、値を取得する場合は、見た目が同じになります。

C言語には3項演算子がありますが、Perlにも存在しています。条件に応じて、値を返すことのできる演算子です。

Perlの演算子の優先順位

Perlの演算子の優先順位です。高い方から書き出しています。

左結合      ->
非結合      ++ --
右結合      ! 単項の+ 単項の-
左結合      * / % x
左結合      + -
左結合      << >>
非結合      < > <= >=
非結合      == !=
左結合      &&
左結合      ||
右結合      = += -= *= などの代入演算子

C言語の演算子の優先順位

C言語の演算子の優先順位です。高い方から書き出しています。

左結合	++ -- ->
右結合	! 単項+ 単項- ++ --
左結合	* / %
左結合	+ -
左結合 << >>
左結合< <= > >=
左結合 == !=
左結合 &&
左結合 ||
右結合 = += -= *= /= %= <<= >>= などの代入演算子

Perlの演算子の優先順位とC言語の演算子の優先順位の比較

Perlの演算子の優先順位とC言語の演算子の優先順位の比較してみましょう。Perlでは、アロー演算子がインクリメント/デクリメント演算子より優先順位が高いことを除いて、C言語と同一です。

Perlでは、C言語で覚えた、演算子の優先順位をほぼそのまま使うことができます。

C言語の演算子や演算子の優先順位に対して、バグが生まれやすいなど、事実に基づかない、過剰な批判をする人もいます。

一方で、Perlは、C言語の演算子の優先順を、そのまま受け入れています。

これは、C言語を学んだことのあるユーザーが、混乱せずに、その知識をそのまま使えるように、Perlでは、配慮されているということです。

C言語は入門教材で、必ず出てくるといってもよいプログラミング言語です。Perlは、C言語に見慣れたユーザーが、混乱しないで、すぐに使い始められるようになっています。

PerlとC言語の他の類似点

この記事では、Perlの演算子の種類と演算子の優先順位がC言語と似ているということを書きましたが、Perlのif文、for文、while文、インクリメント/デクリメント、演算子の優先順位、スコープ、参照概念も、C言語の文法と似ています。