Perl 數組
陣列一個是儲存標量值的無序列表變數。
陣列變數以 @ 開頭。存取陣列元素使用 $ + 變數名稱 + [索引值] 格式來讀取,實例如下:
#!/usr/bin/perl @hits = (25, 30, 40); @names = ("google", "php", "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] = php $names[2] = taobao
建立陣列
陣列變數以@ 符號開始,元素放在括號內,也可以以qw 開始定義數組。
@array = (1, 2, 'Hello'); @array = qw/这是 一个 数组/;
第二個陣列使用 qw// 運算符,它傳回字串列表,陣列元素以空格分隔。當然也可以使用多行來定義數組:
@days = qw/google taobao ... php/;
你也可以按索引來給數組賦值,如下所示:
$array[0] = 'Monday'; ... $array[6] = 'Sunday';
訪問數組元素
##存取數組元素使用
$ + 變數名稱+ [索引值]格式來讀取,實例如下:
@sites = qw/google taobao php/; print "$sites[0]\n"; print "$sites[1]\n"; print "$sites[2]\n"; print "$sites[-1]\n"; # 负数,反向读取
執行上述程序,輸出結果為:
google taobao php php
數組索引值從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
<p>执行以上程序,输出结果为:</p>
<pre>
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
執行以上程序,輸出結果為: | 從輸出的結果可以看出,陣列元素只有四個,但是陣列大小為51。 |
---|---|
Perl 提供了一些有用的函數來新增和刪除陣列元素。 | 如果你之前沒有程式設計經驗,可能會問什麼是函數,其實我們之前使用的 print 就是一個輸出函數。 | 下表列出了數組中常用的操作函數:
#序號#類型和描述 | |
push @ARRAY, LIST | 將清單的值放到陣列的結尾 |
pop @ARRAY | 彈出陣列最後一個值,並傳回它 | ##3
實例
#!/usr/bin/perl # 创建一个简单是数组 @sites = ("google","php","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 php weibo qq facebook 网易/; @sites2 = @sites[3,4,5]; print "@sites2\n";
執行以上程序,輸出結果為:
weibo qq facebook
數組索引需要指定有效的索引值,可以是正數後負數,每個索引值使用逗號隔開。
如果是連續的索引,可以使用.. 來表示指定範圍:
#!/usr/bin/perl @sites = qw/google taobao php 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 = "php"; $var_string = "www-php-com"; $var_names = "google,taobao,php,weibo"; # 字符串转为数组 @test = split('', $var_test); @string = split('-', $var_string); @names = split(',', $var_names); print "$test[3]\n"; # 输出 com 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-php-com"; $var_names = "google,taobao,php,weibo"; # 字符串转为数组 @string = split('-', $var_string); @names = split(',', $var_names); # 数组转为字符串 $string1 = join( '-', @string ); $string2 = join( ',', @names ); print "$string1\n"; print "$string2\n";
執行上述程序,輸出結果為:
www-php-com google,taobao,php,weibo
數組排序
Perl 中數組排序使用sort() 函數,語法格式如下:
sort [ SUBROUTINE ] LIST
參數說明:
#SUBROUTINE:指定規則。
LIMIT:列表或陣列。
實例
#!/usr/bin/perl # 定义数组 @sites = qw(google taobao php facebook); print "排序前: @sites\n"; # 对数组进行排序 @sites = sort(@sites); print "排序前: @sites\n";
執行上述程序,輸出結果為:
排序前: google taobao php facebook 排序前: facebook google php taobao
注意:陣列排序是根據 ASCII 數字值來排序。所以我們在對數組進行排序時最好先將每個元素轉換為小寫後再排序。
特殊變數: $[
特殊變數$[ 表示陣列的第一個索引值,一般都是0 ,如果我們將$[ 設定為1,則陣列的第一個索引值即為1,第二個為2,以此類推。實例如下:
#!/usr/bin/perl # 定义数组 @sites = qw(google taobao php facebook); print "网站: @sites\n"; # 设置数组的第一个索引为 1 $[ = 1; print "\@sites[1]: $sites[1]\n"; print "\@sites[2]: $sites[2]\n";
執行上述程序,輸出結果為:
网站: google taobao php 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