Perl 陣列

Perl 陣列

Perl 陣列一個是儲存標量值的列表變數,變數可以是不同型別。

陣列變數以 @ 開頭。訪問陣列元素使用 $ + 變數名稱 + [索引值] 格式來讀取,例項如下:

例項

#!/usr/bin/perl @hits = (25, 30, 40); @names = ("google", "itread01", "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] = itread01
$names[2] = taobao

建立陣列

陣列變數以 @ 符號開始,元素放在括號內,也可以以 qw 開始定義陣列。

@array = (1, 2, 'Hello');
@array = qw/這是 一個 陣列/;

第二個陣列使用 qw// 運算子,它返回字串列表,陣列元素以空格分隔。當然也可以使用多行來定義陣列:

@days = qw/google
taobao
...
itread01/;

你也可以按索引來給陣列賦值,如下所示:

$array[0] = 'Monday';
...
$array[6] = 'Sunday';

訪問陣列元素

訪問陣列元素使用 $ + 變數名稱 + [索引值] 格式來讀取,例項如下:

例項

@sites = qw/google taobao itread01/; print "$sites[0]\n"; print "$sites[1]\n"; print "$sites[2]\n"; print "$sites[-1]\n"; # 負數,反向讀取

執行以上程式,輸出結果為:

google
taobao
itread01
itread01

陣列索引值從 0 開始,即 0 為第一個元素,1 為第二個元素,以此類推。

負數從反向開始讀取,-1 為第一個元素, -2 為第二個元素


陣列序列號

Perl 提供了可以按序列輸出的陣列形式,格式為 起始值 + .. + 結束值,例項如下:

例項

#!/usr/bin/perl @var_10 = (1..10); @var_20 = (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 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z

陣列大小

陣列大小由陣列中的標量上下文決定。:

@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","itread01","taobao"); $new_size = @sites ; print "1. \@sites = @sites\n"."原陣列長度 :$new_size\n"; # 在陣列結尾新增一個元素 $new_size = push(@sites, "baidu"); print "2. \@sites = @sites\n"."新陣列長度 :$new_size\n"; # 在陣列開頭新增一個元素 $new_size = unshift(@sites, "weibo"); print "3. \@sites = @sites\n"."新陣列長度 :$new_size\n"; # 刪除陣列末尾的元素 $new_byte = pop(@sites); print "4. \@sites = @sites\n"."彈出元素為 :$new_byte\n"; # 移除陣列開頭的元素 $new_byte = shift(@sites); print "5. \@sites = @sites\n"."彈出元素為 :$new_byte\n";

執行以上程式,輸出結果為:


切割陣列

我們可以切割一個數組,並返回切割後的新陣列:

例項

#!/usr/bin/perl @sites = qw/google taobao itread01 weibo qq facebook 網易/; @sites2 = @sites[3,4,5]; print "@sites2\n";

執行以上程式,輸出結果為:

weibo qq facebook

陣列索引需要指定有效的索引值,可以是正數後負數,每個索引值使用逗號隔開。

如果是連續的索引,可以使用 .. 來表示指定範圍:

例項

#!/usr/bin/perl @sites = qw/google taobao itread01 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 14 15 16 17 18 19 20

將字串轉換為陣列

Perl 中將字串轉換為陣列使用 split() 函式,語法格式如下:

split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

引數說明:

  • PATTERN:分隔符,預設為空格。
  • EXPR:指定字串數。
  • LIMIT:如果指定該引數,則返回該陣列的元素個數。

例項

#!/usr/bin/perl # 定義字串 $var_test = "itread01"; $var_string = "www-itread01-com"; $var_names = "google,taobao,itread01,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

執行以上程式,輸出結果為:

o
com
weibo

將陣列轉換為字串

Perl 中將陣列轉換為字串使用 join() 函式,語法格式如下:

join EXPR, LIST

引數說明:

  • EXPR:連線符。
  • LIST:列表或陣列。

例項

#!/usr/bin/perl # 定義字串 $var_string = "www-itread01-com"; $var_names = "google,taobao,itread01,weibo"; # 字串轉為陣列 @string = split('-', $var_string); @names = split(',', $var_names); # 陣列轉為字串 $string1 = join( '-', @string ); $string2 = join( ',', @names ); print "$string1\n"; print "$string2\n";

執行以上程式,輸出結果為:

www-itread01-com
google,taobao,itread01,weibo

陣列排序

Perl 中陣列排序使用 sort() 函式,語法格式如下:

sort [ SUBROUTINE ] LIST

引數說明:

  • SUBROUTINE:指定規則。
  • LIST:列表或陣列。

例項

#!/usr/bin/perl # 定義陣列 @sites = qw(google taobao itread01 facebook); print "排序前: @sites\n"; # 對陣列進行排序 @sites = sort(@sites); print "排序後: @sites\n";

執行以上程式,輸出結果為:

排序前: google taobao itread01 facebook
排序後: facebook google itread01 taobao

注意:陣列排序是根據 ASCII 數字值來排序。所以我們在對陣列進行排序時最好先將每個元素轉換為小寫後再排序。


特殊變數: $[

特殊變數 $[ 表示陣列的第一索引值,一般都為 0 ,如果我們將 $[ 設定為 1,則陣列的第一個索引值即為 1,第二個為 2,以此類推。例項如下:

例項

#!/usr/bin/perl # 定義陣列 @sites = qw(google taobao itread01 facebook); print "網站: @sites\n"; # 設定陣列的第一個索引為 1 $[ = 1; print "\@sites[1]: $sites[1]\n"; print "\@sites[2]: $sites[2]\n";

執行以上程式,輸出結果為:

網站: google taobao itread01 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