陣列(Array)
陣列,你可以想像是多個存放空間,
可以用來存放變數。當然,同樣地,也可以存放數字、文字、甚至特殊符號。
Perl敘述用小老鼠符號(@)表示陣列,後面要賦予這個陣列的名稱,並且要以英文開頭,
可以再給予英文以及數字,像是@a、@a11、@aaa1,
同樣要注意,大寫、小寫視為不同陣列,別搞混了!
而正如上面說的,陣列是多個存放空間。那要如何分辨順序或是編號呢?
表示的方法就是: 陣列名稱換成 變數[位置] 即是:
$array[0] = 123;
注意到哪裡不一樣了嗎?對,就是陣列怎麼成變數了?
只要記得,我們用@array代表整個數列,例如:
@array = () ; # 表示我要清空整個陣列
而當我要指定位置的時候,則把陣列換成變數,以及位置(名稱不變)。即是:
$array[0] = 123; # 表示我要指定陣列第一個位置是數字123
這裡有個地方要注意,陣列位置的順序是從0開始,別忘了喔!
因此,我們可以馬上猜到一個觀念,即是怎麼按照順序把東西放到陣列裡:
$array[0] = 123; # 表示我要指定陣列第一個位置是數字123
$array[1] = 456; # 表示我要指定陣列第二個位置是數字456
$array[2] = 789; # 表示我要指定陣列第三個位置是數字789
看起來的確整齊,而且又不需要分一大堆變數來存。
當然,如果你不想這麼麻煩,你也可以當作串列來處理:
@array = qw/123 456 789/; #其中 qw/123 456 789/ 就是串列
結果會跟上面的一樣。
再來,如果我想加入一個新的值,該怎麼做?
或是,如果我想移除一個舊的值,該怎麼做?
簡單的方法是使用push 以及 pop,這兩個保留字都是對陣列的最後一個元素做操作。
我們直接看例子:
@array = qw/123 456 789/; #設一個陣列 內有3個值
push @array, 135; # 把新值"推"到@array裡
print "$array[0]\n"; # 印出$array[0]以及換行一次
print "$array[1]\n"; # 印出$array[1]以及換行一次
print "$array[2]\n"; # 印出$array[2]以及換行一次
print "$array[3]\n"; # 印出$array[3]以及換行一次
執行結果可以看到,新加入的值被放到[3]的位置,也就是印出 135
而如果是pop,使用的方式也很直覺,指定說我要移除哪一個陣列就好:
@array = qw/123 456 789/; # 設一個陣列 內有3個值
pop @array; # 把@array裡的最後一個值拿掉 記住 是要指定陣列 而不是位置
透過上面兩行,這樣就把@array裡面的最後一個值拿掉了。
不過既然使用了陣列(Array),就不得不提索引值(index)了。
陣列的索引值,指的就是前面所講的存放位置。
判別一個陣列最後一個索引,有個好用的方法,就是錢號井號($#)
一樣直接看例子:
@array = qw/123 456 789/; #設一個陣列 內有3個值
print $#array; # 印出@array的最後一個索引值
執行結果就會是 2 ,即是$array[2] 這個中括號裡面的2。
透過這樣的方式,我們回去上面驗證剛剛pop的程式,
@array = qw/123 456 789/; # 設一個陣列 內有3個值
print "$#array\n"; # 印出@array索引以及換行一次(會印出2)
pop @array;# 把@array裡的最後一個值拿掉
print "$#array\n"; # 印出@array索引以及換行一次(會印出1)
執行結果可以看到,透過pop,陣列的最後一個索引值被拿掉了。
當然,也可以從最前面加入,使用的保留字就是shift以及unshift。
使用方法跟pop以及push一樣。shift是移除第一個,unshift是從最前面補上。
接下來,我們來看看可以利用陣列(Array)來完成什麼事情吧!
常用的有sort、join等等,先來看看sort吧!
sort字面上的意思就是排序,當我希望陣列裡面所有的值由小到大排序時,
sort可以幫助我們達到這個目的,直接看例子吧!
@array = qw/5 -7 3 -2 9 -8 4/; #指定一個串列給陣列 @array
@array_sorted = sort @array; # 將排序過的@array存到@array_sorted
foreach $temp (@array_sorted) # foreach是針對陣列用的迴圈,
# 每一次都會讀取出一個值放到變數$temp裡
{
print "$temp\n";# 跑一次迴圈就印出一次$temp及換行
}
執行結果就會是
注意到了嗎?sort 只會對數字大小作排序,
如果有負號的時候,如果只用sort是不夠的,
因此,我們進行複雜一點的排序,會使用比較特殊的用法
像是這樣:
@array = qw/5 -7 3 -2 9 -8 4/; # 指定一個串列給陣列 @array
@array_sorted = sort { $a <=> $b}@array; # 將排序過的@array存到@array_sorted
foreach $temp (@array_sorted) # foreach是針對陣列用的迴圈,
# 每一次都會讀取出一個值放到變數$temp裡
{
print "$temp\n";# 跑一次迴圈就印出一次$temp及換行
}
$a跟$b在這裡的用法不太一樣,這裡當作Perl的預設變數,
在排序時,被拿來作為取出的兩個數字,而<=>則是表示兩數字的比較。
很類似bubble sort(泡沫排序法)。
而執行結果,我們可以看到:
負數的問題被處裡掉了,陣列都由大到小排列
再來,看看join吧!
join是在陣列之間加入一個字串,便於分開每個陣列的值:
@array = qw/123 456 789/; # 設一個陣列 內有3個值
print join "," , @array; # 表示在陣列間加入逗號 並且印出"整個陣列"
結果就會是 123,456,789
相較於join,不得不提的就是split(分離)
比方說,我們需要把字串依照空格或是逗號做分割,存到陣列裡,
需要使用到的就是split
直接看例子:
$line = "阿逸 的 Perl 學習紀錄 網站"; # 將一列字串存入變數
@array = split(/\s/, $line); # 表示依照\s (space空白)將$line分開的字存入陣列
foreach $temp (@array_sorted) #foreach是針對陣列用的迴圈,
# 每一次都會讀取出一個值放到變數$temp裡
{
print "$temp\n";# 跑一次迴圈就印出一次$temp及換行
}
而執行結果會是:
可以看到字串依空白而分割開來,丟進陣列裡。
在上面的幾個例子中,我們看到foreach被一直使用,
foreach這類的保留字,算是一種控制敘述,
控制敘述可以依照使用者需要,讓程式執行不同的運算,而這就是接下來要提到的部分了!