第四章 Perl操作符

weixin_33936401發表於2016-02-23

Perl操作符就是Perl語法中的一系列符號。每一個操作符都有零個或多個運算元。可以把操作符看成是一系列特別的函式,運算元就是函式的引數。

操作符的特性

學習操作符就是了解每一個操作符的特性,比如:有幾個運算元啊,與其他操作符如何結合,提供什麼語境,什麼語法之類的。

可以使用perldoc perlop 和 perldoc perlsyn來檢視Perl操作符的相關文件。

優先順序

不同的操作符有不同的優先順序,處理順序就是從優先順序最高的開始處理。就像基本數學運算,先算乘除後加減,因為乘除的優先順序比加減法高。

通過perldoc perlop可以檢視所有操作符的優先順序表。不需要特別去記憶這個表,通過簡化程式碼,加上必要的括號,一般都不會有優先順序上的困惑。

結合性

有的操作符是向左邊結合的,如2+3+4,先計算2+3,然後再將結果加上4。有的是向右邊結合的,如234, 先計算3**4,然後計算2的81次方。
當然你只需要知道基本的數學操作符的優先順序和結合性就足夠了。

運算元

0個運算元的叫零元操作符,1個運算元的叫一元操作符,2個運算元的叫2元操作符,3個運算元的叫3元操作符。操作列表的叫列表操作符。

位置

中綴運算子出現在運算元之間。大多數數學運算子都是中綴運算子,如乘號(*)就是在2個數之間的:$length * $width。

字首運算子出現在運算元前面;字尾運算子出現在運算元後面。這些操作符通常都是一元的。字首操作符如邏輯非(!$y),字尾運算子自增($z++)。

將運算元包圍起來的操作符叫環綴操作符。如構造匿名雜湊的({ }),字元操作符(qq[ ])。

還有些操作符比較奇怪,它在某些操作符後面,但是又得包圍其他運算元的。比如訪問雜湊和陣列的元素的操作符$hash{$x} ,$array[$y]。

操作符的型別

數字操作符

數字操作符為運算元提供數字語境。比如標準的數學上的操作符:

+ 加
- 減
* 乘
/ 除
** 乘方
% 模,取餘
+=,-=, *=, /=, **=,  %=  組合形式
--  字首自減
== 相等
!= 不等
> 大於
< 小於
>= 大於等於
<= 小於等於
<=> 排序中的比較符號

字串操作符

字串操作符為運算元提供字串語境。比如正規表示式的繫結操作符(=~, !~),字串連線符(.),字串比較操作符(eq),還有sort排序中的字串比較操作符(cmp)。

邏輯操作符

邏輯操作符為運算元提供布林語境。如&&, ||, and, or,//,三目操作符(?:) 邏輯非 (!), not (優先順序比!低) ,還有xor。
注意//和||的區別,操作符//只要目標運算元有定義就為真,即使是0和空字串。

位操作符

位操作符提供的是數字語境。這些操作符不太常見。
左移位(<<),右移位(>>), 逐位與運算(&), 逐位或運算(|), 逐位異或運算(^), 以及組合形式(<<=,>>=,&=,|=,^=)。

特殊操作符

自增操作符的行為比較特別,當運算元是數字時就數值加一。如果是字串就增長字串。

my $num = 1;
my $str = 'a';

$num++;
$str++;
is( $num, 2, 'numeric autoincrement' );
is( $str, 'b', 'string autoincrement' );


no warnings 'numeric';
$num += $str;
$str++;

is( $num, 2, 'numeric addition with $str' );
is( $str, 1, '... gives $str a numeric part' );

重複操作符(x)也有著複雜的行為,在列表上下文中將列表重複;在標量上下文中,重複並連線成一個字串。
看個例子就明白了:

my @scheherazade = ('nights') x 1001;
my $calendar = 'nights' x 1001;
my $cal_length = length $calendar;

is( @scheherazade, 1001, 'list repeated' );
is( $cal_length, 1001 * length 'nights',
'word repeated' );


my @schenolist = 'nights' x 1001;
my $calscalar = ('nights') x 1001;

is( @schenolist, 1, 'no lvalue list' );
is( length $calscalar,
1001 * length 'nights', 'word still repeated' );

範圍操作符(..),在列表語境下會生成從一個運算元到另一個運算元的列表,可以是數字也可以是字串。
在布林語境下行為很不一樣:操作符初始值為假,在左運算元為真時整體變為真值,持續這個狀態直到右運算元為真時,整體再轉變變為假值。

#列表語境
my @cards = ( 2 .. 10, 'J', 'Q', 'K', 'A' );

#布林語境
 foreach my $x ( 1..10 ){print $x if $x == 3..$x == 4}
# 列印 3 4

#利用該特性來方便地提取郵件正文:
while (/Hello, $user/ .. /Sincerely,/)
{
say "> $_";
}

逗號操作符(,)在標量語境時,它計算並返回左邊的運算元,然後繼續計算右邊的運算元;在列表語境中,它從左到右依次計算2個運算元。

胖箭頭操作符(=>),行為類似逗號操作符,並且會自動引起左邊的運算元。參見雜湊。

三點操作符是零元操作符,沒有運算元,沒有優先順序,沒有結合性。類似佔位符的效果,在執行時會丟擲異常。

sub some_example {
#後續補上
...
}