Location : Home > Languages > Perl > Instruction
Title : Operator (1)
Toolbox Logo

Operator (1)

 Perl で扱うデータに対する演算子について。
 通常の Perl の文法説明では、変数を説明して、それに対する処理(演算)を説明していることが多いと思うのだけれども、ちょっと趣向を変えて、演算のみをまとめている。
 演算子(Operator)は1個以上の対象値(Operand)を基に結果を生み出す。

スカラに対する演算子

数値に対する演算子

 通常の四則演算と同様の計算を行うことができる。

処理内容記述結果
和算 2 + 3 5
差算 2.5 + 0.4 2.1
積算 5 * 3 15
除算 10 / 3 3.3333...

 なお、除算は常に浮動小数点で実行されるので、上記の答えは 10/3 とはならない。

 また、四則演算の他に、べき乗・剰余などの計算も可能である。

処理内容記述結果
べき乗 2 ** 3 8
剰余 10 % 3 2

 さらに、if 文などで比較する際に用いる比較演算子も準備されている。

比較内容記述
等しい ==
等しくない !=
より小さい(未満) <
より大きい >
以下 <=
以上 >=

文字列に対する演算子

 2つの文字列をそのまま連結する演算子が準備されている。

処理内容記述結果
文字列の連結 "Hello" . "World" HelloWorld

 さらに、if 文などで比較する際に用いる比較演算子も準備されている。数値に対する演算子と異なるので注意すること。

比較内容記述意味
等しい eq EQual
等しくない ne Not Equal
より小さい(未満) lt Less Than
より大きい gt Greater Than
以下 le Less than or Equal
以上 ge Greater than or Equal

 なお、文字列の比較における「大小」とは、ASCII コードにおける順序である。
 例えば、数値として 2 と 30 では当然 2 のほうが小さいが、文字列としての "2" と "30" では、 "30" のほうが「小さい」ことに注意。このために数値と文字列とで異なる比較演算子が準備されている。

スカラ変数に対する演算子

 以上はスカラ定数に対する演算子であったが、スカラ変数に対しても演算子が定義されている。
 最も多く用いられるのが代入演算子である。これは名前の通り、スカラ変数に定数を代入する際に用いられる。


$a = 1;
$b = $a * 2;
$b = $b + 3;

 上記の場合、1行めで変数 $a に 1 が代入され、2行めで $b に 1 * 2 の結果である 2 が代入され、3行めでは現在の $b の値である 2 に 3 を加えた値 5 が新たに $b に代入される。

 なお、3行めのように、ある変数への演算の結果をその変数に格納する場合、以下のように略記することができる。


$b += 3;

 これを利用すると、よくループなどで回数を数えたりする際に用いる「$a に 1 を加える」という演算は $a += 1 と記述できるわけだが、これをさらに以下のように略記することができる。


++$a;

 これをインクリメント演算子と言う。逆に1減らす演算子を


--$a;

と記述してデクリメント演算子と言う。

chop( )

 スカラ変数を引数として受け取り、そのスカラ変数に格納されている値の最後の文字を削除してそのスカラ変数に格納する。例えば


$ya = "Hello World";
chop($ya);

であれば、$ya = "Hello Worl" となる。このため、直接スカラ値を引数として渡すことはできない。つまり


chop("Hello World");

はエラーとなる。また


$ya = "Hello World";
$ya = chop($ya);

なんてことをすると、その削除された文字が格納されてしまうので($ya = "d")注意すること。

Updated : 2007/01/09

配列に対する演算子

push( ) と pop( )

 配列を情報を格納するためのスタックとして利用する場合がよくある…と本には書いてある。まあ、私はほとんど数列としてしか使わないけど。まあ、それはそれとして、Perl で配列をスタックとして利用する場合には、新しい値の追加・削除は常にスタック(Perl で言えばリスト)の最後(最も添え字の大きいもの)に対して施される。毎回決まった操作なので専用の関数が準備されている。
 スタックに要素を押し込むので push、スタックからポンッっと飛び出してくるから pop、なのか。

処理内容記述
リストの最後に要素を追加する push(@list, $newValue)
リストから最後の要素を削除する pop(@list)

pop 演算子を空のリストに対して施した場合には undef を返す。また push で値を追加するためには最初の引数(上の例で言えば @list )は配列変数でなければならない。

shift( ) と unshift( )

 上記の push / pop が常にスタックの最後(最も添え字の大きいもの)の要素に対する処理であったのに対し、この shift / unshift は常にスタックの最初(最も添え字の小さいもの)の要素に対して施される。

処理内容記述
リストの最初に要素を追加する unshift(@list, $newValue)
リストから最初の要素を削除する shift(@list)

 pop 演算子同様、shiftを空のリストに対して施した場合には undef を返す。
 要するに、shift 演算子はリストの中で1つずつ「前に詰める」(←これを「シフトする」と呼んでる)ことでずらしていき、最初の要素を押し出してしまうというわけで、unshift はその逆で1つずる後ろにずれて、空いた前に要素を入れる、と。

reverse( )

 渡されたリストを反転させる。


@a = (1, 2, 3);
@b = reverse(@a);

 上の例では @b = (3, 2, 1) となっている。ただしこのとき、元の @a はそのままであることには注意が必要であるかも知れない。単純に自分自身を反転させたい場合には、以下のように反転した結果を自身に格納する必要がある。


@a = reverse(@a);

sort( )

 引数として渡されたリストの各要素を文字列と見なして ASCII コード順にソートして返す。数値のリストを渡しても、いま強調したように、文字列と見なされるので注意が必要である。数値としてソートしたい場合はそれなりにプログラムが必要である。

chop( )

 スカラ変数に対する chop 同様、配列変数についても chop 演算子を施すことができる。ただし配列変数に用いると、全ての要素の最後の1文字が削除される。
 …この説明だけ聞くとどんなときに使うのか不思議に感じるが、ファイルからデータを大量に読みとって配列に格納し、各要素の最後にある改行文字(\n)のみを一挙に削除するときに絶大な効力を発揮する。

Updated : 2007/03/08

ハッシュ(連想記憶)に対する演算子

keys( )

 呼び出された時点でハッシュに格納されている全てのキーのリストを返す。スカラコンテキストで用いた際にはキーの個数を返す。なお括弧は省略してもかまわない。

values( )

 呼び出された時点でハッシュに格納されている全ての値のリストを返す。なお括弧は省略してもかまわない。

each( )

 ハッシュ全体に対して処理を行いたい場合に、全てのキーにわたって処理することを示す。例えば


%Name = ();
$Name{"Junichiro"} = "Koizumi";
$Name{"Shinzo"} = "Abe";

とハッシュが定義されていたとするときに


while (($First, $Last) = each(%Name)){
   print "The lastname of $First is $Last.\n";
}

という具合に書ける。普通の配列の場合には for i = 1 ... と書けるのだが、ハッシュの場合にはキーをいちいち記述することが困難(というかそんなことするならハッシュを使う意味がない)なので、ハッシュに適した書法が準備されたのだろう。

delete( )

 ハッシュからキーと値の組を削除する。以下のように記述する。


delete %Name{"Shinzo"}

 すると対応する記憶が消えて、%Name には{"Junichiro", "Koizumi"}しかなくなる。

Updated : 2007/03/08

Toolbox Logo
Updated : 2007/03/08