Perl數組和hash相關函數

Perl數組和hash相關函數php

內置的數組函數有:java

each, keys, pop, push, shift, splice, unshift, values

內置的hash函數有:python

delete, each, exists, keys, values

有些是重複的。因此放在一塊兒解釋。c++

數組相關函數:shell

  • push:將單元素或一個列表追加到數組的尾部,返回追加後的數組長度具體示例push
  • pop:刪除數組中的最後一個元素,返回被pop掉的元素,具體示例top
  • unshift:將單元素或一個列表追加到數組的首部,返回追加後的數組長度具體示例push
  • shift:刪除數組中的第一個元素,返回被shift掉的元素,具體示例top
  • splice:從指定位置處刪除、插入元素,具體示例splice

hash相關函數:(比較簡單,因此不介紹)數組

  • delete:刪除給定key
  • exists:測試key是否存在於hash中

共同函數:(比較簡單,因此不介紹)ruby

  • keys:獲取hash或數組(5.12版本纔開始提供)的key,對於數組,則是返回索引位置。對於hash,返回的key的順序是不肯定的
  • values:返回hash或數組(5.12版本纔開始提供)的值。values返回的元素順序和keys返回的順序是一致的
  • each:遍歷hash或數組

push & unshift

將一個列表追加到一個數組的尾部,返回追加後數組的長度。函數

push ARRAY,LIST
unshift ARRAY,LIST
  • push是將一個列表(可能只有一個元素)追加到數組的最尾部
  • unshift則是將一個列表(可能只有一個元素)追加到數組的最前面
  • 它們返回追加後數組的長度
  • 追加列表的時候,不是每次追加一個元素,而是一次追加一整個列表,因此新追加到數組中的元素順序保持不變

注意,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 & shift

pop ARRAY
pop
shift ARRAY
shift
  • pop從數組中移除並返回最後一個元素
  • shift從數組中移除並返回第一個元素
  • 若是數組已空,則pop/shift返回undef
  • 若是省略ARRAY,則pop/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

splice

pop/push、unshift/shift操做的都是數組的開頭,或者末尾。splice(中文譯爲:粘接)則能夠指定操做數組中的哪一個位置。

splice ARRAY
splice ARRAY,OFFSET
splice ARRAY,OFFSET,LENGTH
splice ARRAY,OFFSET,LENGTH,LIST
  • splice在移除元素時,在列表上下文返回被移除的元素列表,標量上下文返回最後一個被移除的元素

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一個函數便可,方便的多,但鏈表畢竟增、刪元素的效率高,因此對於大數組又要頻繁增刪改的時候,仍是是現成鏈表比較好。

相關文章
相關標籤/搜索