Perl 數組
數組一個是存儲標量值的無序列表變量。
數組變量以@ 開頭。 訪問數組元素使用$ +變量名稱+ [索引值]格式來讀取,實例如下:
#!/usr/bin/perl @hits = (25, 30, 40); @names = ("google", "w3big", "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] = w3big $names[2] = taobao
創建數組
數組變量以@符號開始,元素放在括號內,也可以以qw開始定義數組。
@array = (1, 2, 'Hello'); @array = qw/这是 一个 数组/;
第二個數組使用qw//運算符,它返回字符串列表,數組元素以空格分隔。 當然也可以使用多行來定義數組:
@days = qw/google taobao ... w3big/;
你也可以按索引來給數組賦值,如下所示:
$array[0] = 'Monday'; ... $array[6] = 'Sunday';
訪問數組元素
訪問數組元素使用$ +變量名稱+ [索引值]格式來讀取,實例如下:
@sites = qw/google taobao w3big/; print "$sites[0]\n"; print "$sites[1]\n"; print "$sites[2]\n"; print "$sites[-1]\n"; # 负数,反向读取
執行以上程序,輸出結果為:
google taobao w3big w3big
數組索引值從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
數組大小
數組大小由數組中的標量上下文決定。 :
@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","w3big","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 w3big weibo qq facebook 网易/; @sites2 = @sites[3,4,5]; print "@sites2\n";
執行以上程序,輸出結果為:
weibo qq facebook
數組索引需要指定有效的索引值,可以是正數後負數,每個索引值使用逗號隔開。
如果是連續的索引,可以使用..來表示指定範圍:
#!/usr/bin/perl @sites = qw/google taobao w3big 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 = "w3big"; $var_string = "www-w3big-com"; $var_names = "google,taobao,w3big,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-w3big-com"; $var_names = "google,taobao,w3big,weibo"; # 字符串转为数组 @string = split('-', $var_string); @names = split(',', $var_names); # 数组转为字符串 $string1 = join( '-', @string ); $string2 = join( ',', @names ); print "$string1\n"; print "$string2\n";
執行以上程序,輸出結果為:
www-w3big-com google,taobao,w3big,weibo
數組排序
Perl 中數組排序使用sort() 函數,語法格式如下:
sort [ SUBROUTINE ] LIST
參數說明:
- SUBROUTINE:指定規則。
- LIMIT:列表或數組。
實例
#!/usr/bin/perl # 定义数组 @sites = qw(google taobao w3big facebook); print "排序前: @sites\n"; # 对数组进行排序 @sites = sort(@sites); print "排序前: @sites\n";
執行以上程序,輸出結果為:
排序前: google taobao w3big facebook 排序前: facebook google w3big taobao
注意:數組排序是根據ASCII 數字值來排序。 所以我們在對數組進行排序時最好先將每個元素轉換為小寫後再排序。
特殊變量: $[
特殊變量$[表示數組的第一索引值,一般都為0 ,如果我們將$[設置為1,則數組的第一個索引值即為1,第二個為2,以此類推。 實例如下:
#!/usr/bin/perl # 定义数组 @sites = qw(google taobao w3big facebook); print "网站: @sites\n"; # 设置数组的第一个索引为 1 $[ = 1; print "\@sites[1]: $sites[1]\n"; print "\@sites[2]: $sites[2]\n";
執行以上程序,輸出結果為:
网站: google taobao w3big 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