Perl數組和hash相關函數php
內置的數組函數有:java
each, keys, pop, push, shift, splice, unshift, values
內置的hash函數有:python
delete, each, exists, keys, values
有些是重複的。因此放在一塊兒解釋。c++
數組相關函數:shell
hash相關函數:(比較簡單,因此不介紹)數組
共同函數:(比較簡單,因此不介紹)ruby
將一個列表追加到一個數組的尾部,返回追加後數組的長度。函數
push ARRAY,LIST unshift ARRAY,LIST
注意,unshift在數組開頭追加一個列表,會致使數組中原有的元素索引總體後移。例如原數組內容爲a b c d
,unshift一個新元素後,a就變成第二個元素,索引位置從0變成1,b的索引位置從1變成2,c的索引位置從2變成3,d的索引位置從3變成4。在數組較小時,unshift並不會有什麼影響,但數組較大,會嚴重影響效率。測試
例如:code
@arr=qw(python shell php); push @arr,"perl","Ruby"; print "@arr"; # 輸出:python shell php perl Ruby
push的返回值爲追加元素成功後,數組的長度:
@arr=qw(python shell php); print push @arr,"perl","Ruby"; # 輸出:5
pop操做,在結果上等價於:
for my $value (@LIST){ $ARRAY[++$#ARRAY] = $value; }
但push效率更高,由於它是一次追加一整個列表,而非一次追加一個列表中的元素。
pop ARRAY pop shift ARRAY shift
@ARGV
,但若是是在子程序中,則操做的是@_
注意,shift刪除第一個元素會致使數組的索引位置總體向前移動。例如數組內容爲a b c d
,但shift一次後,b就變成了第一個元素,它的索引位置從1變成0,c的索引位置從2變成1,d的索引位置從3變成2。在數組較小時,shift並不會有什麼影響,但數組較大,會嚴重影響效率。
例如:循環刪除數組的最後一個元素
@arr=qw(python shell php); while(my $poped = pop @arr){ print $poped,"\n"; # 依次輸出:php shell python }
當省略ARRAY時,且不在子程序中時,pop將操做@ARGV
。
while(my $poped=pop){ print $poped,"\n"; }
執行它:
$ ./test.pl a.txt b.txt c.txt c.txt b.txt a.txt
同理,在子程序中,則操做默認的參數數組@_
。
sub mysub() { while(my $poped=pop){ print $poped,"\n"; } } &mysub(qw(a.txt b.txt c.txt)); # 將依次輸出c.txt b.txt a.txt
pop/push、unshift/shift操做的都是數組的開頭,或者末尾。splice(中文譯爲:粘接)則能夠指定操做數組中的哪一個位置。
splice ARRAY splice ARRAY,OFFSET splice ARRAY,OFFSET,LENGTH splice ARRAY,OFFSET,LENGTH,LIST
1.一個參數時,即splice ARRAY
,表示清空ARRAY。
use 5.010; @arr=qw(perl py php shell); @new_arr=splice @arr; say "original arr: @arr"; # 輸出:空 say "new arr: @new_arr"; # 輸出原列表內容
若是splice在標量上下文,則返回最後一個被移除的元素:
use 5.010; @arr=qw(perl py php shell); $new_arr=splice @arr; say "$new_arr"; # 輸出:shell
2.兩個參數時,即splice ARRAY,OFFSET
,表示從OFFSET處開始刪除元素直到結尾。
注意,OFFSET能夠是負數。
例如:
use 5.010; @arr=qw(perl py php shell); @new_arr=splice @arr,2; say "original arr: @arr"; # 輸出:perl py say "new arr: @new_arr"; # 輸出:php shell
若是offset爲負數,則表示從後向前數第幾個元素,-1表示最後一個元素。
use 5.010; @arr=qw(perl py php shell); @new_arr=splice @arr,-3; say "original arr: @arr"; # 輸出:perl say "new arr: @new_arr"; # 輸出:py php shell
3.三個參數時,即splice ARRAY,OFFSET,LENGTH
,表示從OFFSET處開始向後刪除LENGTH個元素。
注意,LENGTH能夠爲負數,也能夠爲0,它們都有奇效。
例如:
use 5.010; @arr=qw(perl py php shell ruby); @new_arr=splice @arr,2,2; say "original arr: @arr"; # 輸出:perl py ruby say "new arr: @new_arr"; # 輸出:php shell
若是length爲負數(假設爲-3),則表示從offset處開始刪除,直到尾部還保留-length個元素(-3時,即表示尾部保留3個元素)。例如:
use 5.010; @arr=qw(perl py php shell ruby java c c++ js); @new_arr=splice @arr,2,-2; # 從php開始刪除,最後只保留c++和js兩個元素 say "original arr: @arr"; # 輸出:perl py c++ js say "new arr: @new_arr"; # 輸出:php shell ruby java c
若是正數length的長度超出了數組邊界,則刪除結尾。若是負數length超出了邊界,也就是保留的數量比要刪除的數量還要多,這時保留優先級更高,也就是不會刪除。例如,從某個位置開始刪除,後面還有2個元素,但若是"length=-2",則這兩個元素不會被刪除。
若是length爲0,則表示不刪除,這個在有第4個參數LIST時有用。
4.四個參數時,即splice ARRAY,OFFSET,LENGTH,LIST
,表示將LIST插入到刪除的位置,也就是替換數組的部分位置連續的元素。
例如:
use 5.010; @arr=qw(perl py php shell ruby); @list=qw(java c); @new_arr=splice @arr,2,2,@list; say "original arr: @arr"; # 輸出:perl py java c ruby say "new arr: @new_arr"; # 輸出:php shell
若是想原地插入新元素,而不刪除任何元素,能夠將length設置爲0,它會將新列表插入到offset的位置。
use 5.010; @arr=qw(perl py php shell ruby); @list=qw(java c); @new_arr=splice @arr,2,0,@list; say "original arr: @arr"; # 輸出:perl py java c php shell ruby say "new arr: @new_arr"; # 輸出:空
注意上面php在新插入元素的後面。
splice功能很是好用,在很多語言中,要實現相似的功能,須要藉助鏈表的方式來實現,比較複雜。splice一個函數便可,方便的多,但鏈表畢竟增、刪元素的效率高,因此對於大數組又要頻繁增刪改的時候,仍是是現成鏈表比較好。