|
|
Perlプログラム作成の演算子 |
H.Kamifuji . |
Perlでは加算や減算などを行う為の演算子が用意されているます。ここでは用意されている各種演算子の使い方や演算子間の優先順位などを確認します。 なお比較演算子、論理演算子、範囲演算子については別の箇所で解説します。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 |
|
演算子の中でも四則演算などを行う算術演算子について確認していきます。数値を足したり引いたりするために使用します。用意されている演算子は下記のようなものがあります。
使用方法としては次のようになります。 8 + 3 6 - 2 4 * 7 12 / 4 8 % 3 2 ** 3例えば「8 + 3」と書かれた部分は「11」と演算された結果を書いた時と同じ扱いになります。 演算結果を変数に格納する演算子によって演算が行われた結果を変数に格納することが出来ます。使用方法としては次のようになります。my $var; $var = 8 + 3;上記では変数「$var」に「8 + 3」と言う演算が行われた結果である「11」と言う数値が格納されます。 なお先に「+」の演算が行われた後で「=」によって変数に代入が行われるのは、「+」演算子の方が「=」演算子よりも優先順位が高いためです。優先順位については別のページで詳しく解説します。 では簡単なプログラムで確認して見ます。 サンプルプログラム下記のサンプルを実行してみよう。# 算術演算子 use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my $var; $var = 8 + 3; print "8 + 3 = $var\n"; $var = 4 ** 3; print "4 ** 3 = $var\n"; $var = 8 / 4; print "8 / 4 = $var\n"; $var = 7 / 3; print "7 / 3 = $var\n";上記を「test1-1.pl」の名前で保存してから次のように実行して下さい。 ![]() 今回は演算した結果を変数に一度格納してから画面に出力しています。 Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Ope]$ perl test1-1_u.pl | nkf -w 8 + 3 = 11 4 ** 3 = 64 8 / 4 = 2 7 / 3 = 2.33333333333333 [xxxxxxxx@dddddddddd Ope]$ |
算術演算子や他の演算子でも同じですが数値などの値と値だけではなく、値と変数そして変数と変数といった演算を行うことが可能です。例えば変数に格納された数値に対して数値を加算して別の変数に格納することが出来ます。 変数と値の演算の例としては次のようになります。 my ($var1, $var2); $var1 = 10; $var2 = $var1 + 8;上記では変数「$var1」には数値の「10」が格納されています。そして「$var1 + 8」の結果、すなわち「18」が変数「$var2」に格納されます。 また変数と変数に対する演算も行うことが出来ます。 my ($var1, $var2, $sum); $var1 = 10; $var2 = 8; $sum = $var1 + $var2;上記では変数「$var1」には数値の「10」が変数「$var2」には数値の「8」が格納されています。そして変数「$sum」は変数「$var1」と変数「$var2」に格納されている数値の加算の結果、すなわち「18」が格納されます。 演算結果を変数に格納する変数に対する演算結果を別の変数に格納するほかに、ある変数に対する演算結果を同じ変数に再度格納するという処理もよく使われます。例えば次のような場合です。my $var; $var = 8; $var = $var + 3;上記では変数「$var」にまず数値の「8」を格納します。そして次の行で変数「$var」に数値の「3」を加算した結果を変数「$var」に格納しています。その結果変数「$var」には「11」と言う数値が格納されます。 この演算では代入演算子である「=」の右辺と左辺に同じ変数「$var」が使われています。慣れないと分かりにくいですが、右辺を左辺に格納する処理を行っているだけです。この処理は次のように記述した場合と同じです。 my ($var, $dumy); $var = 8; $dumy = $var + 3; $var = $dumy;よく使われる記述方法ですので覚えておいて下さい。 では簡単なプログラムで確認して見ます。 サンプルプログラム下記のサンプルを実行してみよう。# 変数に対する演算 use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my $var; $var = 8; print "$var\n"; $var = $var + 7; print "$var\n";上記を「test2-1.pl」の名前で保存してから次のように実行して下さい。 ![]() 今回は変数に対して演算した結果を同じ変数に格納ししてから画面に出力しています。 Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Ope]$ perl test2-1_u.pl | nkf -w 8 15 [xxxxxxxx@dddddddddd Ope]$ |
算術演算の中でも変数に格納されている値を1だけ増加させる、又は1だけ減少させるという演算は特に利用されることが多くなっています。「+」や「-」を使うことで次のように記述することが出来ます。 my $var; $var = 10; $var = $var + 1;もちろん上記のように記述しても問題無いのですが、1だけ増加又は1だけ減少させるための特別な演算子が用意されています。1だけ増加させる演算子をインクリメント演算子と言い「++」を使います。また1だけ減少させる演算子をデクリメント演算子と言い「--」を使います。 インクリメント演算子及びデクリメント演算子は次のように記述します。 変数++; 変数--;値や変数の後に「++」又は「--」を記述することで、演算子の前に書かれた値や変数に格納されている値を1だけ増加させたり1だけ減少させたりすることが出来ます。例えば先ほどの例をインクリメント演算子を使うことで次のように記述することが出来ます。 my $var; $var = 10; $var++;この場合は変数「$var」に数値の「10」を格納した後で、変数「$var」に格納されている値を1だけ増加させます。この結果変数「$var」には数値の「11」が格納されます。 では簡単なプログラムで確認して見ます。 test3-1.pl サンプルプログラム下記のサンプルを実行してみよう。# インクリメント及びデクリメント演算子 use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my $var; $var = 3; print "$var\n"; $var++; print "$var\n"; $var--; print "$var\n";上記を「test3-1.pl」の名前で保存してから次のように実行して下さい。 ![]() インクリメント演算子とデクリメント演算子には前置きと後置きの2種類が存在します。こちらの違いは次のページで解説します。 Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Ope]$ perl test3-1_u.pl | nkf -w 3 4 3 [xxxxxxxx@dddddddddd Ope]$ |
インクリメント演算子とデクリメント演算子には、それぞれ前置きと後置きの二種類が存在します。 インクリメント演算子の前置きと後置きは次のようになります。 前置き: ++変数 後置き: 変数++デクリメント演算子の前置きと後置きは次のようになります。 前置き: --変数 後置き: 変数--前のページで使った演算子は後置きのインクリメント演算子です。前置きも後置きもどちらも変数の値を1だけ増加させるという点では同じ動作をします。例えば次の例を見てください。 my ($var1, $var2); $var1 = 10; $var2 = 10; $var++; print "$var\n"; ++$var; print "$var\n";上記では変数「$var1」も変数「$var2」もインクリメント演算子を実行した後は同じく1だけ増加します。 前置きと後置きの違いでは前置きと後置きの違いを確認します。次の例を見てください。my ($var1, $var2); $var1 = 10; $var2 = $var1++;この場合、変数「$var2」には変数「$var1」に格納されている数値に1が加算された「11」が格納されるように思われますが実際には「10」が格納されます。実は上記の例は次のように記述した場合と同じです。 my ($var1, $var2); $var1 = 10; $var2 = $var1; $var1 = $var1 + 1;後置きの場合にはインクリメント演算子による演算以外の処理を先に行います。つまり「$var2 = $var1」がまず行われるということです。その為、変数「$var2」には1を増加させる前の「10」が格納されます。そして最後にインクリメント演算子の演算が行われるため変数「$var1」が増加されます。 では次に前置きの例を見てみます。 my ($var1, $var2); $var1 = 10; $var2 = ++$var1;上記の場合は変数「$var2」には「11」が格納されます。前置きの場合には次のように記述した場合と同じです。 my ($var1, $var2); $var1 = 10; $var1 = $var1 + 1; $var2 = $var1;前置きの場合にはインクリメント演算子による演算をまず先に行います。つまり「$var1 = $var1 + 1」がまず行われるということです。そしてインクリメント演算子以外の処理が行われます。この時点で変数「$var1」は1増加していますので変数「$var2」には「11」が可能されることになります。 デクリメント演算子の場合も同様で前置きの「--変数」の場合にはまず1だけ減算する処理が行われるのに対して、後置きの「変数--」の場合には他の処理が行われてから減算の処理が行われます。 前置きと後置きでは単独で実行した場合には同じ結果となりますが、インクリメント演算子やデクリメント演算子と他の処理を組み合わせて使う場合には前置きと後置きで結果が異なることがありますので注意して下さい。 では簡単なプログラムで確認して見ます。 サンプルプログラム下記のサンプルを実行してみよう。# 前置きと後置き use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my ($var1, $var2); $var1 = 9; $var2 = $var1++; print "$var1\n"; print "$var2\n"; $var1 = 9; $var2 = ++$var1; print "$var1\n"; print "$var2\n";上記を「test4-1.pl」の名前で保存してから次のように実行して下さい。 ![]() 前置きと後置きで処理内容が異なることが確認できます。 Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Ope]$ perl test4-1_u.pl | nkf -w 10 9 10 10 [xxxxxxxx@dddddddddd Ope]$ |
代入演算子は演算子の左辺に対して右辺の値を代入する場合に使用される演算子です。単純に値を代入するだけではなく、何らかの計算を行った結果を代入する事も出来ます。 代表的なものとしては今までも使ってきた「=」です。「=」では右辺の値を左辺に代入します。 左辺 = 右辺;この場合は右辺のある値を左辺に代入します。基本的には左辺には変数が記述され、右側には数値や文字列の他に別の変数を記述されます。 その他の代入演算子代入演算子には「=」以外に他の算術演算子と組み合わせた演算子が用意されています。まず演算子の種類を確認しておきます。
ある変数に対する演算の結果を変数に再度格納する場合に使用できます。例えば次のように使います。 my $var; $var = 10; $var += 5;上記は次のように記述した場合と同じです。 my $var; $var = 10; $var = $var + 5;他の演算子の場合も同様です。ある変数に対して何らかの演算を行った後で、同じ変数に格納し直す場合の簡易的な記述方法と考えて下さい。 また次のような演算子も用意されています。
「&&=」や「||=」については別のページで確認します。「.=」は右辺に書かれた文字列を左辺の文字列の最後に追加する場合の簡易的な記述方法です。 では簡単なプログラムで確認して見ます。 test5-1.pl サンプルプログラム下記のサンプルを実行してみよう。# 代入演算子 use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my $var; $var = 9; $var += 5; print "$var\n"; $var /= 2; print "$var\n";上記を「test5-1.pl」の名前で保存してから次のように実行して下さい。 ![]() Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Ope]$ perl test5-1_u.pl | nkf -w 14 7 [xxxxxxxx@dddddddddd Ope]$ |
ビット演算子とは数値に対してビット単位で演算を行うための演算子です。ビット演算子には次のものが用意されています。
ビット演算子の中で左シフトと右シフトはシフト演算子とも呼ばれます。シフト演算子については次のページで確認します。ではそれぞれの演算子について確認してみます。 ビットANDビットANDは演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットが共に「1」の場合だけ「1」にします。例として「11」と「14」のビットANDを取ってみます。 1011 = 11 1110 = 14 ------------ 1010 = 10対象となる数値の「11」と「14」をそれぞれ2進数で表します。そして各ビットを比較しますがビットANDの場合は両方の値のビットが「1」になっている場合は「1」を、それ以外は「0」とします。その結果、2進数の「1010」(10進数の「10」)と言う結果を取得することが出来ます。 my $var; $var = 11; $var = $var & 14;上記の結果として変数「$var」には数値の「10」が格納されます。 ビットORビットORは演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットのどちらかが「1」の場合に「1」にします。例として「10」と「12」のビットORを取ってみます。 1010 = 10 1100 = 12 ------------ 1110 = 14対象となる数値の「10」と「12」をそれぞれ2進数で表します。そして各ビットを比較しますがビットORの場合はどちらかの値のビットが「1」になっている場合は「1」を、それ以外は「0」とします。その結果、2進数の「1110」(10進数の「14」)と言う結果を取得することが出来ます。 my $var; $var = 10; $var = $var | 12;上記の結果として変数「$var」には数値の「14」が格納されます。 ビットXORビットXORは演算子の左辺と右辺の同じ位置にあるビットを比較して、ビットの値が異なる場合にだけ「1」にします。例として「10」と「12」のビットXORを取ってみます。 1010 = 10 1100 = 12 ------------ 0110 = 6対象となる数値の「10」と「12」をそれぞれ2進数で表します。そして各ビットを比較しますがビットXORの場合は2つの値のビットの値が異なっている場合は「1」を、それ以外は「0」とします。その結果、2進数の「0110」(10進数の「6」)と言う結果を取得することが出来ます。 my $var; $var = 10; $var = $var ^ 12; ビットNOTビットNOTは演算子の右辺の値の各ビットに対して「1」の場合は「0」に、「0」の場合は「1」にします。例として「10」のビットNOTを取ってみます。 00000000000000000000000000001010 = 10 -------------------------------------- 11111111111111111111111111110101 = 4294967285対象となる数値の「10」を2進数で表します。そしてビットNOTの場合はビットが「1」の場合は「0」に、ビットが「0」の場合は「1」とします。その結果、2進数の「11111111111111111111111111110101」(10進数の「4294967285」)と言う結果を取得することが出来ます。 ビットNOTの場合、整数として扱うことが出来る32ビットの値として反転します(64ビットマシンを使っていた場合は64ビットの値として反転させます)。「0101」となるわけでないので注意して下さい。 my $var; $var = 10; $var = ~$var;上記の結果として変数「$var」には数値の「4294967285」が格納されます。 では簡単なプログラムで確認して見ます。 test6-1.pl サンプルプログラム下記のサンプルを実行してみよう。# ビット演算子 use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my ($src, $dst); $src = 11; $dst = $src & 14; print "$src \& 14 = $dst\n"; $src = 10; $dst = $src | 12; print "$src | 12 = $dst\n"; $src = 10; $dst = $src ^ 12; print "$src ^ 12 = $dst\n"; $src = 10; $dst = ~$src; print "~$src = $dst\n";上記を「test6-1.pl」の名前で保存してから次のように実行して下さい。 ![]() Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Ope]$ perl test6-1_u.pl | nkf -w 11 & 14 = 10 10 | 12 = 14 10 ^ 12 = 6 ~10 = 18446744073709551605 [xxxxxxxx@dddddddddd Ope]$ |
シフト演算子はビット演算子の一つで数値の各ビットを左又は右へシフトさせるための演算子です。
ビット演算子と同じく対象の値を2進数のビットとして考え、ビットを左又は右へシフトさせます。なお2進数において左へ1つビットをシフトさせることは値を2倍することに相当し、右へ1つビットをシフトさせることは値を1/2にすることに相当します。 左シフトそれではまず左シフトから確認してみます。例として11を1ビット左へシフトさせてみます。00000000000000000000000000001011 = 11 --------------------------------------- 00000000000000000000000000010110 = 22各ビットを指定した数だけ左へシフトします。左端からはみ出した部分は削除され、シフトしたことによって空いた右端は「0」が格納されます。結果として11を1ビット左へシフトすると22となります。 my $var; $var = 11; $var = $var << 11;上記の結果として変数「$var」には数値の「22」が格納されます。 右シフト次に右シフトから確認してみます。例として11を1ビット右へシフトさせてみます。00000000000000000000000000001011 = 11 --------------------------------------- 00000000000000000000000000000101 = 5各ビットを指定した数だけ右へシフトします。右端からはみ出した部分は削除され、シフトしたことによって空いた左端は「0」が格納されます。結果として11を1ビット右へシフトすると5となります。 my $var; $var = 11; $var = $var >> 11;上記の結果として変数「$var」には数値の「5」が格納されます。 なお負の値に対して右シフトした場合、プログラム言語によっては左端に「1」が格納されるものもありますが、Perlでは負の値であっても左端には「0」が格納されます。 では簡単なプログラムで確認して見ます。 test7-1.pl サンプルプログラム下記のサンプルを実行してみよう。# シフト演算子 use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my ($src, $dst); $src = 11; $dst = $src << 1; print "$src << 1 = $dst\n"; $src = 11; $dst = $src >> 1; print "$src >> 1 = $dst\n";上記を「test7-1.pl」の名前で保存してから次のように実行して下さい。 ![]() Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Ope]$ perl test7-1_u.pl | nkf -w 11 << 1 = 22 11 >> 1 = 5 [xxxxxxxx@dddddddddd Ope]$ |
文字列に対する操作を行う演算子として文字列の連結と文字列の繰り返しを行う演算子が用意されています。 文字列の連結文字列の連結を行うには「文字列と数値」で既に解説している「.」演算子を使います。"文字列1"."文字列2"「.」演算子の左辺及び右辺に記述された文字列を連結した新しい文字列を返します。この時「文字列1」及び「文字列2」自体には変化がありません。 my ($str1, $str2); $str1 = "こんにちは"; $str2 = $str1."伊藤さん";上記では変数「$str2」には「こんにちは伊藤さん」と言う文字列が格納されますが、変数「$str1」は「こんにちは」と言う文字列が格納されたままです。 文字列の繰り返し対象の文字列を指定した回数だけ繰り返した新しい文字列を作成することが出来ます。「x」演算子を使います。"文字列" x 繰り返し回数小文字の「x」の左辺に書かれた文字列を右辺に書かれた回数だけ繰り返した新しい文字列を返します。 my ($str1, $str2); $str1 = "こんにちは"; $str2 = $str1 x 3;上記では変数「$str2」には「こんにちは」が3回繰り返された「こんにちはこんにちはこんにちは」が格納されます。 では簡単なプログラムで確認して見ます。 test8-1.pl サンプルプログラム下記のサンプルを実行してみよう。# 文字列演算子 use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my ($str1, $str2, $str3); $str1 = "こんにちは"; $str2 = $str1."伊藤さん"; $str3 = $str1 x 3; print "$str1\n"; print "$str2\n"; print "$str3\n";上記を「test8-1.pl」の名前で保存してから次のように実行して下さい。 ![]() Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Ope]$ perl test8-1_u.pl | nkf -w こんにちは こんにちは伊藤さん こんにちはこんにちはこんにちは [xxxxxxxx@dddddddddd Ope]$ |
Perlではダブルクオーテーションで囲まれた値は文字列として認識されます。その為、「"5"」と記述した場合は文字列の「5」ですし、単に「5」と記述した場合は数値の「5」となります。 ただPerlにおいては文字列と数値を厳密には区分していません。使用される演算子の種類によって、その演算子に対象となる値を文字列と判別したり数値と判別したりします。例えば「+」演算子を使う場合には左辺及び右辺に書かれた値を数値と判別します。 次の例で考えてみます。 my $var; $var = "3" + 4;上記の場合、「+」演算子の左辺は文字列の「3」ですが、自動的に数値の「3」と判断し演算を行います。その結果、変数「$var」には数値の「7」が格納されます。 もう1つ別の例で考えてみます。 my $var; $var = "3".4;上記の場合、「.」演算子の右辺は数値の「4」ですが、自動的に文字列の「4」と判断し演算を行います。その結果、変数「$var」には文字列の「34」が格納されます。これは「.」演算子を使う場合には左辺及び右辺に書かれた値を文字列として扱うためです。 数値の形式ではない文字列の扱い例えば「12ab34」などの数値と文字が混じった文字列に対して四則演算などの演算を行った場合を確認します。このような文字列の場合は先頭から数値の部分だけが取り出した数値として扱われます。よって「12ab34」に対して四則演算などを行った場合は数値の「12」として扱われます。my $var; $var = "12ab34" * 5;上記の場合は「12 * 5」の結果である「60」が変数「$var」に格納されます。 また数値が含まれない文字列の場合は「0」として扱われます。よって「abc」に対して四則演算などを行った場合は数値の「0」として扱われます。 my $var; $var = "abc" + 4;上記の場合は「0 + 4」の結果である「4」が変数「$var」に格納されます。 ただし「use warnings;」を記述している場合に純粋な数値では無い文字列に対して四則演算などを行うと「Argument xxxx isn't numeric in addition」と言う警告が表示されます。 では簡単なプログラムで確認して見ます。 test9-1.pl サンプルプログラム下記のサンプルを実行してみよう。# 文字列と数値の自動変換 use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my ($var1, $var2, $var3, $var4); $var1 = "3" + 4; $var2 = "3".4; $var3 = "12ab34" * 5; $var4 = "abc" + 4; print "\"3\" + 4 = $var1\n"; print "\"3\".4 = $var2\n"; print "\"12ab34\" * 5 = $var3\n"; print "\"abc\" + 4 = $var4\n";上記を「test9-1.pl」の名前で保存してから次のように実行して下さい。 ![]() Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Ope]$ perl test9-1_u.pl | nkf -w Argument "12ab34" isn't numeric in multiplication (*) at test9-1_u.pl line 13. Argument "abc" isn't numeric in addition (+) at test9-1_u.pl line 14. "3" + 4 = 7 "3".4 = 34 "12ab34" * 5 = 60 "abc" + 4 = 4 [xxxxxxxx@dddddddddd Ope]$ |
演算子が一つだけの場合は優先順位を気にする必要はありませんが複数の演算子を組み合わせる場合には演算子の優先順位を把握しておく必要があります。 主な演算子の優先順位は次のようになっています。
他にも演算子はありますが主なものだけを抜粋しました。表の見方としては優先順位は上に行くほど高く下に行くほど低くなります。また同じ行に含まれる演算子は同じ優先順位です。 例えば演算子「*」は演算子「+」よりも優先順位が高くなっています。下記のサンプルを見てください。 my $var; $var = 10 + 5 * 3;「*」は「+」よりも優先順位が高いのでまず「5 * 3」が行われます。 my $var; $var = 10 + 15;次に「10 + 15」が行われます。その結果である「25」が変数「$var」に格納されます。なお代入演算子である「=」は優先順位が「*」や「+」よりも低くなっていますので、代入は最後に行われます。 同じ優先順位である「*」と「/」が同時に使われていた場合は結合順位に従って処理が行われます。「*」や「/」の結合順位は左ですので左から順に演算が行われます。下記のサンプルを見てください。 my $var; $var = 10 * 3 / 5;「*」と「/」は優先順位が同じですので結合順位に従い左から順に処理が行われます。よって「10 * 3」がまず実行されます。 my $var; $var = 30 / 5;次に「30 / 5」が行われます。その結果である「6」が変数「$var」に格納されます。 カッコを使って優先順位を変更演算子は優先順位に従って処理が行われますが、括弧は最上位の優先順位ですので括弧を使うことで演算順位を制御することが出来ます。my $var; $var = 10 + 5 * 3;上記では先に「5 * 3」が行われます。ここで「10 + 5」を先に行いたい場合にはカッコを使って次のように記述します。 my $var; $var = (10 + 5) * 3;上記ではカッコで囲まれた演算が一番最優先となりますのでまずは「10 + 5」が行われます。 my $var; $var = 15 * 3;そして「15 * 3」が行われます。その結果である「45」が変数「$var」に格納されます。 では簡単なプログラムで確認して見ます。 test10-1.pl サンプルプログラム下記のサンプルを実行してみよう。# 演算子の優先順位 use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my $var; $var = 10 * 3 / 5; print "10 * 3 / 5 = $var\n"; $var = (10 + 5) * 3; print "(10 + 5) * 3 = $var\n";上記を「test10-1.pl」の名前で保存してから次のように実行して下さい。 ![]() Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Ope]$ perl test10-1_u.pl | nkf -w 10 * 3 / 5 = 6 (10 + 5) * 3 = 45 [xxxxxxxx@dddddddddd Ope]$ |
|