Perl 數組一個是儲存標量值的列表變量,變數可以是不同類型。
數組變數以@ 開頭。存取數組元素使用$ + 變數名稱+ [索引值]格式來讀取,實例如下:
實例
#!/usr/bin/perl @hits = ( 25 , 30 , 40 ) ; @names = ( " google " , " codercto " , " taobao " ) ; print " $ hits[0] = $hits [0] n " ; print " $ hits[1] = $hits [1] n " ; print " $ hits[2] = $hits [2] n " ; print " $ names[0] = $names [0] n " ; print " $ names[1] = $names [1] n " ; print " $ names[2] = $names [2] n " ;程式中$ 符號使用了 來轉義,讓他原樣輸出。
$hits[0] = 25$hits[1] = 30$hits[2] = 40$names[0] = google$names[1] = codercto$names[2] = taobao
建立數組
陣列變數以@符號開始,元素放在括號內,也可以以qw開始定義陣列。
@array = (1, 2, 'Hello');@array = qw/這是一個陣列/;
第二個陣列使用qw//運算符,它傳回字串列表,陣列元素以空格分隔。當然也可以使用多行來定義數組:
@days = qw/googletaobao...codercto/;
你也可以按索引來給數組賦值,如下圖:
$array[0] = 'Monday';...$array[6] = 'Sunday';
存取數組元素
存取數組元素使用$ + 變數名稱+ [索引值]格式來讀取,實例如下:
實例
@sites = qw/ google taobao codercto / ; print " $sites [0] n " ; print " $sites [1] n " ; print " $sites [2] n " ; print " $sites [-1] n " ; # 負數,反向讀取googletaobaocoderctocodercto
陣列索引值從0 開始,即0 為第一個元素,1 為第二個元素,以此類推。
負數從反向開始讀取,-1 為第一個元素, -2 為第二個元素
數組序號
Perl 提供了一個可以按序列輸出的陣列形式,格式為起始值+ .. + 結束值,實例如下:
實例
#!/usr/bin/perl @var_1 0 = ( 1 . .10 ) ; @var_2 0 = ( 10 . .20 ) ; @var_abc = ( a .. z ) ; print " @var_10 n " ; # 輸出1 到10 print " @var_20 n " ; # 輸出10 到20 print " @var_abc n " ; # 輸出a 到z 1 2 3 4 5 6 7 8 9 1010 11 12 13 14 15 16 17 18 19 20a bcdefghijklmnopqrstuv wxyz
數組大小
數組大小由數組中的標量上下文決定。 :
@array = (1,2,3);print "陣列大小: ",標量@array,"n";
數組長度回傳的是數組物理大小,而不是元素的個數,我們可以看以下實例:
實例
#!/uer/bin/perl @array = ( 1 , 2 , 3 ) ; $array [ 50 ] = 4 ; $size = @array ; $max_index = $#array ; print "數組大小: $size n " ; print "最大索引: $max_index n " ;數組大小: 51最大索引: 50
從輸出的結果可以看出,陣列元素只有四個,但是陣列大小為51。
新增和刪除數組元素
Perl 提供了一些有用的函數來新增和刪除陣列元素。
如果你之前沒有程式設計經驗,可能會問什麼是函數,其實我們之前使用的print就是一個輸出函數。
下表列出了數組中常用的操作函數:
序號 | 類型和描述 |
---|
1 | push @ARRAY, LIST 將列表的值放到陣列的結尾 |
2 | pop @ARRAY 彈出數組最後一個值,並返回它 |
3 | shift @ARRAY 彈出數組第一個值,並傳回它。數組的索引值也依序減一。 |
4 | unshift @ARRAY, LIST 將列表放在陣列前面,並傳回新陣列的元素個數。 |
實例
#!/usr/bin/perl # 建立一個簡單是數組@sites = ( " google " , " codercto " , " taobao " ) ; print " 1. @ sites = @sites n " ; # 在陣列結尾加上一個元素push ( @sites , " baidu " ) ; print " 2. @ sites = @sites n " ; # 在陣列開頭加上一個元素unshift ( @sites , " weibo " ) ; print " 3. @ sites = @sites n " ; # 刪除陣列末端的元素pop ( @sites ) ; print " 4. @ sites = @sites n " ; # 移除陣列開頭的元素shift ( @sites ) ; print " 5. @ sites = @sites n " ;切割數組
我們可以切割一個數組,並返回切割後的新數組:
實例
#!/usr/bin/perl @sites = qw/ google taobao codercto weibo qq facebook 網易/ ; @sites2 = @sites [ 3 , 4 , 5 ] ; print " @sites2 n " ; weibo qq facebook
陣列索引需要指定有效的索引值,可以是正數後負數,每個索引值使用逗號隔開。
如果是連續的索引,可以使用..來表示指定範圍:
實例
#!/usr/bin/perl @sites = qw/ google taobao codercto weibo qq facebook 網易/ ; @sites2 = @sites [ 3 . .5 ] ; print " @sites2 n " ; weibo qq facebook
替換數組元素
Perl 中數組元素替換使用splice() 函數,語法格式如下:
splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]
參數說明:
@ARRAY:要替換的陣列。
OFFSET:起始位置。
LENGTH:替換的元素個數。
LIST:替換元素列表。
以下實例從第6個元素開始取代數組中的5個元素:
實例
#!/usr/bin/perl @nums = ( 1 . .20 ) ; print "替換前- @nums n " ; splice ( @nums , 5 , 5 , 21 . .25 ) ; print "替換後- @nums n " ;替換前- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20替換後- 1 2 3 4 5 21 22 23 24 25 11 12 13 1915 13 1919
將字串轉換為數組
Perl 中將字串轉換為陣列使用split() 函數,語法格式如下:
split [ PATTERN [ , EXPR [ , LIMIT ] ] ]
參數說明:
PATTERN:分隔符,預設為空格。
EXPR:指定字串數。
LIMIT:如果指定該參數,則傳回該陣列的元素個數。
實例
#!/usr/bin/perl # 定義字串$var_test = " codercto " ; $var_string = " www-codercto-com " ; $var_names = " google,taobao,codercto,weibo " ; # 字串轉為陣列@test = split ( ' ' , $var_test ) ; @string = split ( ' - ' , $var_string ) ; @names = split ( ' , ' , $var_names ) ; print " $test [3] n " ; # 輸出o print " $string [2] n " ; # 輸出com print " $names [3] n " ; # 輸出weibo ocomweibo
將數組轉換為字串
Perl 中將陣列轉換為字串使用join() 函數,語法格式如下:
join EXPR, LIST
參數說明:
EXPR:連接符。
LIST:列表或陣列。
實例
#!/usr/bin/perl # 定義字串$var_string = " www-codercto-com " ; $var_names = " google,taobao,codercto,weibo " ; # 字串轉為陣列@string = split ( ' - ' , $var_string ) ; @names = split ( ' , ' , $var_names ) ; # 陣列轉為字串$string1 = join ( ' - ' , @string ) ; $string2 = join ( ' , ' , @names ) ; print " $string1 n " ; print " $string2 n " ; www-codercto-comgoogle,taobao,codercto,weibo
數組排序
Perl 中陣列排序使用sort() 函數,語法格式如下:
sort [ SUBROUTINE ] LIST
參數說明:
SUBROUTINE:指定規則。
LIST:列表或陣列。
實例
#!/usr/bin/perl # 定義數組@sites = qw( google taobao codercto facebook ) ; print "排序前: @sites n " ; # 對陣列進行排序@sites = sort ( @sites ) ; print "排序後: @sites n " ;排序前: google taobao codercto facebook排序後: facebook google codercto taobao
注意:數組排序是根據ASCII 數字值來排序。所以我們在對數組進行排序時最好先將每個元素轉換為小寫後再排序。
特殊變數: $[
特殊變數$[表示數組的第一個索引值,一般都是0 ,如果我們將$[設為1,則數組的第一個索引值即為1,第二個為2,以此類推。實例如下:
實例
#!/usr/bin/perl # 定義數組@sites = qw( google taobao codercto facebook ) ; print "網站: @sites n " ; # 設定數組的第一個索引為1 $ [ = 1 ; print " @ sites[1]: $sites [1] n " ; print " @ sites[2]: $sites [2] n " ;網址: google taobao codercto facebook@sites[1]: google@sites[2]: taobao
一般情況我們不建議使用特殊變數$[ ,在新版Perl 中,變數已廢棄。
合併數組
數組的元素是以逗號來分割,我們也可以使用逗號來合併數組,如下所示:
實例
#!/usr/bin/perl @numbers = ( 1 , 3 , ( 4 , 5 , 6 ) ) ; print " numbers = @numbers n " ; numbers = 1 3 4 5 6
也可以在數組中嵌入多個數組,並合併到主數組中:
實例
#!/usr/bin/perl @odd = ( 1 , 3 , 5 ) ; @even = ( 2 , 4 , 6 ) ; @numbers = ( @odd , @even ) ; print " numbers = @numbers n " ; numbers = 1 3 5 2 4 6
從清單中選擇元素
一個列表可以當作一個陣列使用,在列表後指定索引值可以讀取指定的元素,如下所示:
實例
#!/usr/bin/perl $var = ( 5 , 4 , 3 , 2 , 1 ) [ 4 ] ; print " var 的值為= $var n " var 的值為= 1
同樣我們可以在數組中使用..來讀取指定範圍的元素:
實例
#!/usr/bin/perl @list = ( 5 , 4 , 3 , 2 , 1 ) [ 1 . .3 ] ; print " list 的值= @list n " ; list 的值= 4 3 2