Perl - 第十章 | Perl 運算符
什麼是運算符?
可以使用表達式4 + 5等於9給出簡單答案。這裡的4和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 次方 |
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| $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";
|
這將產生以下結果:
1 2 3 4 5 6 7
| $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。
運算符 |
描述 |
範例 |
== |
檢查兩個操作數的值是否相等,如果相等則條件為 true,否則為 false。 |
($a == $b) 為 false |
!= |
檢查兩個操作數的值是否相等,如果不相等則條件為 true,否則為 false。 |
($a != $b) 為 true。 |
<=> |
檢查兩個操作數的值是否相等,如果左邊的數小於右邊的數返回 -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。 |
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| $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"; }
|
這將產生以下結果:
1 2 3 4 5 6 7 8
| $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。 |
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| $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";
|
這將產生以下結果:
1 2 3 4 5 6 7
| $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 |
%= |
求模且賦值運算符,求兩個操作數的模賦值給左邊操作數 |
$c %= $a 相等於 $c = $c % a |
**= |
乘冪且賦值運算符,求兩個操作數的乘冪賦值給左邊操作數 |
$c *= $a 相等於 $c = $c * $a |
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| $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";
|
這將產生以下結果:
1 2 3 4 5 6 7 8 9
| $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,現在以二進制格式表示,它們如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13
| $ a = 0011 1100
$ b = 0000 1101
-----------------
$ a&$ b = 00001100
$ a | $ b = 0011 1101
$ a ^ $ b = 0011 0001
〜$ a = 1100 0011
|
Perl 支持的位運算符如下表所示:
運算符 |
描述 |
範例 |
& |
如果同時存在於兩個操作數中,二進制 AND 運算符複製一位到結果中。 |
($a & $b) 將得到 12,二進制為 0000 1100 |
| |
如果存在於任一操作數中,二進制 OR 運算符複製一位到結果中。 |
($a | $b) 將得到 61 ,二進制為 0011 1101 |
^ |
如果存在於其中一個操作數中但不同時存在於兩個操作數中,二進制異或運算符複製一位到結果中。 |
($a ^ $b) 將得到 49,二進制為 0011 0001 |
~ |
二進制補碼運算符是一元運算符,具有”翻轉”位效果。 |
(~$a ) 將得到 -61 ,二進制為 1100 0011 ,2 的補碼形式,帶符號的二進制數。 |
<< |
二進制左移運算符。左操作數的值向左移動右操作數指定的位數。 |
$a << 2 將得到 240 ,二進制為 1111 0000 |
>> |
二進制右移運算符。左操作數的值向右移動右操作數指定的位數。 |
$a >> 2 將得到 15 ,二進制為 0000 1111 |
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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";
|
這將產生以下結果:
1 2 3 4 5 6 7
| $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 |
邏輯或運算符。如果兩個操作數中有任意一個非零,則條件為 true。 |
($a or $b) 為 true。 |
|
|
|
not |
邏輯非運算符。用來反轉操作數的邏輯狀態。如果條件為 true,則邏輯非運算符將使其為 false。 |
not($a and $b) 為 true。 |
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| $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";
|
這將產生以下結果:
1 2 3 4 5 6
| $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` |
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| $a = 10; $b = q{a = $a}; print "q{a = \$a} = $b\n";
$b = qq{a = $a}; print "qq{a = \$a} = $b\n";
$t = qx{date}; print "qx{date} = $t\n";
|
這將產生以下結果:
1 2 3
| q{a = $a} = a = $a qq{a = $a} = a = 10 qx{date} = 2021年 3月13日 週六 11時03分14秒 CST
|
其他運算符
除了以上我們提到的運算符外,Perl 還支持以下運算符:
運算符 |
描述 |
範例 |
. |
點號 (.) 用於連接兩個字符串。 |
如果 $a="abc", $b="edf" , $a.$b 結果為 "abcedf" |
x |
x 運算符返回字符串重複的次數。 |
(‘-‘ x 3) 輸出為 —。 |
.. |
.. 為範圍運算符。 |
(2..5) 輸出結果為 (2, 3, 4, 5) |
++ |
自增運算符,整數值增加 1 |
$a =10, $a++ will 輸出為 11 |
-- |
自減運算符,整數值減少 1 |
$a =10, $a– 輸出為 9 |
-> |
箭號用於指定一個類的方法 |
$obj->$a 表示對象 $obj 的 $a 方法。 |
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| $a = "abc"; $b = "edf";
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";
|
這將產生以下結果:
1 2 3 4 5 6 7
| $a = abc , $b = edf $a . $b = abcedf "-" 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 |
從左到右 |
範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| $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";
|
這將產生以下結果:
1 2 3 4 5
| $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
|
註:以上參考了
Tutorialspoint, Perl - Operators