2011年10月6日 星期四

陣列(Array)

陣列(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)來完成什麼事情吧!

常用的有sortjoin等等,先來看看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這類的保留字,算是一種控制敘述

控制敘述可以依照使用者需要,讓程式執行不同的運算,而這就是接下來要提到的部分了!

沒有留言:

張貼留言