運算符是一種告訴編譯器執行特定的數學或邏輯操作的符号,如: 3+2=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 次方
#!/usr/bin/perl
$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";
以上程式執行輸出結果為:
==
檢查兩個操作數的值是否相等,如果相等則條件為 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。
if( $a == $b ){
print "$a == \$b 結果 true\n";
}else{
print "\$a == \$b 結果 false\n";
}
if( $a != $b ){
print "\$a != \$b 結果 true\n";
print "\$a != \$b 結果 false\n";
$c = $a <=> $b;
print "\$a <=> \$b 傳回 $c\n";
if( $a > $b ){
print "\$a > \$b 結果 true\n";
print "\$a > \$b 結果 false\n";
if( $a >= $b ){
print "\$a >= \$b 結果 true\n";
print "\$a >= \$b 結果 false\n";
if( $a < $b ){
print "\$a < \$b 結果 true\n";
print "\$a < \$b 結果 false\n";
if( $a <= $b ){
print "\$a <= \$b 結果 true\n";
print "\$a <= \$b 結果 false\n";
以下表格執行個體中設定變量 $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。
$a = "abc";
$b = "xyz";
print "\$a = $a ,\$b = $b\n";
if( $a lt $b ){
print "$a lt \$b 傳回 true\n";
print "\$a lt \$b 傳回 false\n";
if( $a gt $b ){
print "\$a gt \$b 傳回 true\n";
print "\$a gt \$b 傳回 false\n";
if( $a le $b ){
print "\$a le \$b 傳回 true\n";
print "\$a le \$b 傳回 false\n";
if( $a ge $b ){
print "\$a ge \$b 傳回 true\n";
print "\$a ge \$b 傳回 false\n";
if( $a ne $b ){
print "\$a ne \$b 傳回 true\n";
print "\$a ne \$b 傳回 false\n";
$c = $a cmp $b;
print "\$a cmp \$b 傳回 $c\n";
=
簡單的指派運算符,把右邊操作數的值賦給左邊操作數
$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
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";
位運算符作用于位,并逐位執行操作。
設定 $a = 60,$b = 13,現在以二進制格式表示,它們如下所示:
Perl 支援的位運算符如下表所示:
&
如果同時存在于兩個操作數中,二進制 AND 運算符複制一位到結果中。
($a & $b) 将得到 12,二進制為 0000 1100
|
如果存在于任一操作數中,二進制 OR 運算符複制一位到結果中。
($a | $b) 将得到 61 ,二進制為 0011 1101
^
如果存在于其中一個操作數中但不同時存在于兩個操作數中,二進制異或運算符複制一位到結果中。
($a ^ $b) 将得到 49,二進制為 0011 0001
~
二進制反碼運算符是一進制運算符,具有"翻轉"位效果,即0變成1,1變成0。
(~$a ) 将得到 -61 ,二進制為 1100 0011 ,一個有符号二進制數的反碼形式。
<<
二進制左移運算符。左操作數的值向左移動右操作數指定的位數。
$a << 2 将得到 240 ,二進制為 1111 0000
>>
二進制右移運算符。左操作數的值向右移動右操作數指定的位數。
$a >> 2 将得到 15 ,二進制為 0000 1111
use integer;
$a = 60;
$b = 13;
$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";
Perl 邏輯運算符如下表所示。
表格執行個體中我們設定變量 $a 為 true, $b 為 false。
and
邏輯與運算符符。如果兩個操作數都為 true,則條件為 true。
($a and $b) 為 false。
&&
C 風格的邏輯與運算符符。如果兩個操作數都為 true,則條件為 true
($a && $b) 為 false。
or
邏輯或運算符。如果兩個操作數中有任意一個非零,則條件為 true。
($a or $b) 為 true。
||
C 風格邏輯或運算符。如果兩個操作數中有任意一個非零,則條件為 true。
($a || $b) 為 true。
not
邏輯非運算符。用來反轉操作數的邏輯狀态。如果條件為 true,則邏輯非運算符将使其為 false。
not($a and $b) 為 true。
$a = true;
$b = false;
$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";
Perl 引号運算符如下表所示。
q{ }
為字元串添加單引号
q{abcd} 結果為 'abcd'
qq{ }
為字元串添加雙引号
qq{abcd} 結果為 "abcd"
qx{ }
為字元串添加反引号
qx{abcd} 結果為 `abcd`
$b = q{a = $a};
print "q{a = \$a} = $b\n";
$b = qq{a = $a};
print "qq{a = \$a} = $b\n";
# 使用 unix 的 date 指令執行
$t = qx{date};
print "qx{date} = $t\n";
除了以上我們提到的運算符外,Perl 還支援以下運算符:
.
點号 (.) 用于連接配接兩個字元串。
如果 $a="run", $b="oob" , $a.$b 結果為 "runoob"
x
x 運算符傳回字元串重複的次數。
('-' x 3) 輸出為 ---。
..
.. 為範圍運算符。
(2..5) 輸出結果為 (2, 3, 4, 5)
++
自增運算符,整數值增加 1
$a =10, $a++ 輸出為 11
--
自減運算符,整數值減少 1
$a =10, $a-- 輸出為 9
->
箭号用于指定一個類的方法
$obj->$a 表示對象 $obj 的 $a 方法。
$a = "run";
$b = "oob";
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";
$b = 15;
$a++;
$c = $a ;
print "\$a 執行 \$a++ = $c\n";
$b--;
$c = $b ;
print "\$b 執行 \$b-- = $c\n";
下表列出了 Perl 語言的運算符優先級:
運算符符
結合性
++, --
無
-, ~, !
從右到左
=~, !~
從左到右
*, /, %, x
+, -, .
<<, >>
-e, -r,
<, <=, >, >=, lt, le, gt, ge
==, !=, <=>, eq, ne, cmp
|, ^
? and :
=, +=, -=, *=,
其他
,
or, xor
$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";