(1,2,"perl","python") ("var1","var2","var3") () # 空列表
if(defined(())){ # 對空列表()進行判斷 print "defined"; }else{ print "undefined"; # 返回此行 }
(1,2,3,) # 等價於(1,2,3) (1,2,,,4) # 等價於(1,2,4)
((1,2,3),("a","b","c"))
會壓扁成(1,2,3,"a","b","c")
(1..5) # 等價於(1,2,3,4,5) (1,2,3..5,7) # 等價於(1,2,3,4,5,7) (3.5..6) # 等價於(3,4,5,6) (3.5..6.5) # 等價於(3,4,5,6) (-3..2) # 等價於(-3,-2,-1,0,1,2) ($m..$n) # 範圍由$m和$n決定 (a..d) # ("a","b","c","d") /^one/ .. /^two/ # 匹配從one開頭的行到two開頭的行 /^one/ .. eof # 匹配從one開頭的行到最後一行
其實範圍操做符有兩種:..
和...
,它們只在匹配範圍的時候有區別。例如一段文本內容爲:php
start here end here second line end
若是使用/start/../end/
,那麼在第一行就結束了匹配,由於第一行能同時匹配start和end,若是想要第一行匹配start,再也不匹配end,而是匹配第三行的end,那麼須要使用/start/.../end/
。實際上,範圍操做符的左邊被匹配了稱爲flip,右邊被匹配了稱爲flop,三個點的範圍操做符...
表示flip以後不要當即作flop評估,而是在本次以後評估flop。java
使用qw寫列表,無需加引號,無需加逗號分隔,而是使用空格分隔。python
如下兩個列表等價:shell
("perl","python","shell") qw(perl python shell)
\n
)$perl="perl"; qw($perl python shell\n) # 不會作任何轉換,包含三個元素"$perl"、"python"、"shell\n"
qw( perl python shell )
注意,不能在qw換行內部加上註釋#
。因此,下面#
和它後面的字符串也被看成列表元素數組
qw( perl python # This is python shell )
qw/ var1 var2 var3 / qw! var1 var2 var3 ! qw% var1 var2 var3 % qw# var1 var2 var3 # # 這個有點像註釋 ... qw( var1 var2 var3 ) qw< var1 var2 var3 > qw{ var1 var2 var3 } qw[ var1 var2 var3 ]
若是定界符中間要包含定界符符號,只要轉義就能夠了。ruby
qw/ var1 var2 \/var3 var4 /
更好的方法是換成其它定界符。函數
qw{ /root/xyz.sh /etc/xyz.sh }
($perl,$python)=("perl","python"); print $perl,"\n"; print $python,"\n";
($perl,$python)=($python,$perl);
($perl,$python,$shell) =qw(perl python shell php); # php被忽略 ($perl,$python,$shell,$php)=qw(perl python shell); # $php被賦值爲undef
print qw{perl python shell}; @subject=qw{perl python shell}; print @subject;
@subject=("perl","python","shell"); @range=1..5; @subject=(@subject,"hello",@range);
()
,由於未定義,因此它自身返回undef@empty=(); if(@empty){ print "valid\n"; }else{ print "invalid\n"; # 返回此行 } @subject1=qw{perl python shell}; @subject2=(@subject,@empty,"php"); # 等價於(@subject,"php") @subject3=(@subject,undef,"php"); # 不等價於(@subject,"php")
$arr="xyz"; @arr=(var0,var1,var2); # 這是一個列表,賦值給了數組。 # 列表中的元素沒有加引號包圍 print $arr[0],$arr[1],$arr[2],"\n"; # 引用數組變量 print $arr; # 輸出xyz print @arr,"\n"; # 輸出var0var1var2 print "@arr","\n" # 輸出var0 var1 var2
$#arr
表示最後一個索引值,它比數組元素個數小1(由於有個0索引)。因此$arr[$#arr]
引用的是最後一個元素($arr[-1]
也是最後一個元素)。print $arr[1.3]; # 等價於$arr[1] print $arr[-1]; # 最後一個元素 print $arr[-2]; # 倒數第二個元素 print $arr[100]; # undef print $arr[-100]; # undef print $arr[$#arr]; # 最後一個元素 print $arr[$#arr-1]; # 倒數第二個元素
@{arr}
、$#{arr},這樣的引用方式能夠避免歧義。@{arr1}=(var0,var1,var2)
@arr2=(var0,var1,var2); print $arr2[100]; # undef print $#arr2; # 返回2 $arr2[5]="var5" # 將填充$arr2[3],$arr2[4]爲undef print $#arr2; # 返回5
@arr
。注意下面的例子中print @arr,"\n"
和print @arr."\n"
,僅僅是一個逗號和點號的區別,返回結果卻徹底不一樣。這就是不一樣上下文環境中的執行結果。spa
@arr=(var0,var1,var2); # 數組,裏面的元素不用引號包圍 $arr[4]="var4"; # 直接對數組變量賦值,會自動填充$arr[3]:undef print @arr,"\n"; # 引用整個數組:var0var1var2var4 print @arr."\n"; # 輸出的是5,表示的是數組中元素個數 # 由於這裏的數組從列表上下文切換成了標量上下文, # 數組將返回元素個數
push函數:向數組尾部(最右邊)插入元素;
pop函數:彈出(移除並返回)數組尾部的元素;當沒有元素可彈時,則pop返回undef。code
pop和push用於實現堆棧,像堆盤子同樣,不斷往上堆,也從上面開始取。blog
@arr = 5..9; # (5,6,7,8,9) $var1 = pop(@arr); print @arr,"\n",$var1,"\n"; # 返回5678和9 $var2 = pop @arr; print @arr,"\n",$var2,"\n"; # 返回567和8 pop @arr; # 直接丟棄彈出的元素 print @arr,"\n"; # 返回56
倒數第二行的pop @arr
沒有作任何賦值,perl中有不少這種用法,當有返回內容時,卻不對其賦值,表示僅執行操做,但丟棄操做後的返回結果,在perl中,這種稱爲"空上下文"(void context)。因此,這裏能夠表示直接刪除數組的最後一個元素。
@arr=(5,6); push(@arr,0); # @arr如今是(5,6,0) push @arr,1..10; # @arr如今有13個元素:5,6,0,1,2,3,4,5,6,7,8,9,10 @other=qw{1 3 4 5}; push @arr,@other; # @arr如今17個元素:5,6,0,1,2,3,4,5,6,7,8,9,10,1,3,4,5
push和pop是操做數組尾部,shift和unshift則是操做數組頭部:
- shift彈出(移除並返回)數組的第一個元素(最左邊),當沒有元素可彈時,shift將返回undef;
- unshift向數組最左邊插入一個元素。
@arr = qw{perl python shell}; $m = shift(@arr); # $m變成"perl",@arr如今是("python","shell") $n = shift @arr; # $n變成"python",@arr如今是("shell") shift @arr; # @arr變成空了 %i = shift @arr; # $i爲undef,@arr仍是空 unshift @arr,5; # @arr如今是(5) unshift @arr,4; # @arr如今是(4,5) @other=1..3; unshift @arr,@other; # @arr如今變爲(1,2,3,4,5)
shift-unshift和pop-push操做的是數組首尾部。若是想要操做數組的中間某個元素,則須要使用splice()函數。
splice()函數有4個參數,後兩個參數可選。
若是隻給兩個參數,則從索引位置開始,一直刪除到數組結尾。
# 兩個參數 @arr = qw{perl python shell php java}; @arr1 = splice @arr,2; # @arr如今是qw{perl python} # @arr1如今是qw{shell php java} # 三個參數 @arr = qw{perl python shell php java}; @arr1 = splice @arr,2,2; # @arr如今是qw{perl python java} # @arr1如今是qw{shell php} # 四個參數 @arr = qw{perl python shell php java}; @arr1 = splice @arr,2,2,qw{ruby}; # @arr如今是qw{perl python ruby java} # @arr1如今是qw{shell php}
在使用四個參數的時候,若是將第三個參數設置爲0,則能夠不用作任何刪除就向數組中插入新元素。
@arr = qw{perl python shell php java}; @arr1 = splice @arr,2,0,qw{ruby}; # @arr如今是qw{perl python ruby shell php java} # @arr1如今是qw()
foreach能夠遍歷列表或數組。
foreach $subject qw(perl python shell){ print $subject,"\n"; }
其中$subject是控制變量,每一個迭代過程當中,都會從列表或數組中取出一個元素賦值給控制變量。
迭代數組:
@arr=qw(perl python shell); foreach $subject (@arr){ print $subject,"\n"; }
迭代過程當中,賦值給控制變量的實際上是列表或數組中的引用,並不是是直接取出元素的值賦值給控制變量的(也就是說,不是變量複製)。所以,在foreach過程當中修改控制變量的值也會修改列表/數組中元素的值。
@arr=qw(perl python shell); foreach $subject (@arr) { $subject .= "aaa"; } print @arr; # 輸出perlaaapythonaaashellaaa
當foreach遍歷結束後,控制變量將復原爲foreach遍歷前的值(例如未定義的是undef)。
$subject="php"; foreach $subject (qw(perl python shell)){ } print $subject; # 輸出"php"
$_
在foreach遍歷結構中也能夠省略控制變量部分,這時會使用默認的變量$_
做爲控制變量,每次迭代都會從數組中取出一個列表/數組的索引賦值給$_
。
foreach (qw(perl python shell)) { print $_,"\n"; }
其實,perl中不少地方沒有"需求數據"時,都會自動使用$_
。例以下面的print函數就使用了$_
。
$_="hello world!\n"; print;
數字<大寫字母<小寫字母
。在之後,還能夠自定義排序規則。print reverse 11,6..8,20,"\n"; # 輸出順序:20 8 7 6 11 @arr=qw(perl python shell); reverse @arr; # 反轉了順序,但返回結果丟棄了,@arr不變 print @arr,"\n"; # 返回順序:perl python shell @arr1=reverse @arr; # @arr1中元素的順序:shell python perl print '@arr1: ',@arr1,"\n"; @sort_arr=sort @arr; # 排序,但由於@arr中元素順序本就是升序的 print '@sort_arr: ',@sort_arr,"\n"; # 返回順序:perl python shell sort @arr; # 雖排序,但丟棄了排序結果
each操做符能夠獲取一個鍵值對(key/value)。能夠操做數組,也能夠操做hash。each操做hash的內容見後文。
each對數組操做時,返回的是數組中元素的索引號和該元素的值。
my @arr=qw(perl python shell); while (my($index,$value) = each(@arr)){ print "$index: $value","\n"; }
其中my關鍵字表示該變量是局部變量。如下是執行結果:
0: perl 1: python 2: shell
若是不使用each,則須要遍歷數組,並獲取數組的索引以及元素的值。
@arr=qw(perl python shell); foreach $index (0..$#{arr}) { print "$index: $arr[$index]","\n"; }