7個perl陣列高階操作技巧分享

2021-08-07 17:42:34 字數 3007 閱讀 3687

這篇文章主要介紹了7個perl陣列高階操作技巧,本文講解了陣列去重、陣列合併、查詢最大值、列表歸併等內容,需要的朋友可以參考下

1、去除乙個陣列中的重複元素:

使用grep函式**片段: 

**:複製**

**如下:

my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 ); 

my %count; 

my @uniq_times = grep < 2; } @array;

使用轉換hash**片段: 

**:複製**

**如下:

my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 ); 

my %saw; 

@saw = ( ); 

my @uniq_array = sort keys %saw;

2、合併兩個array:

複製**

**如下:

push @array1, @array2;

3、快速查詢最大值,不知道的程式猿們,這樣搞:

複製**

**如下:

my @nums = 0 .. 1000;

my $max = $nums[0];

foreach (@nums)

知道的這樣搞:

複製**

**如下:

use list::util qw(max);

my $max_num = max( 0 .. 1000 );

知道的他們還這樣搞:

複製**

**如下:

use list::util qw(maxstr);

my $max_str = maxstr ( qw( fido spot rover ) );

字串比較玩弄於掌中。還有sum:

複製**

**如下:

use list::util qw(sum);

my $sum = sum ( 1 .. 1000 );

4、列表歸併

數字求和,也可以用list::util中的reduce:

複製**

**如下:

use list::util qw(reduce);

my $sum = reduce 1 .. 1000;

與sort類似,reduce也是用code block作為引數,不過執行機制稍微不同。每次迭代,先從引數列表取出前面兩個元素,分別設定為別名$a和$b,這樣引數列表的長度就會縮短為兩個元素。然後reduce把語句塊返回的計算結果再壓回到引數列表的頭部。如此往復,直到最後列表裡只剩下乙個元素,也就是迭代的計算結果$sum。

好了,可以這樣了:

複製**

**如下:

my $product = reduce 1 .. 1000;

5、判斷是否有元素匹配

純粹用perl實現,找到列表中第乙個符合某條件的元素,比找出所有符合條件的要麻煩一些。下面的例子,判斷是否有大於1000的元素:

複製**

**如下:

my $found_a_match = grep @list;

注意:如果@list有一億個元素,而要找的就是1001?grep仍然還會迴圈一億次,當然你可以向下面自己控制下:

複製**

**如下:

my $found_a_match = 0;

foreach my $elem (@list)

還是那句話,不簡單~~~list::util有現成的東西:

複製**

**如下:

use list::util qw(first);

my $found_a_match = fist @list;

在list::moreutils模組中,也提供很多的實用函式:

複製**

**如下:

my $found_a_match = any @list;

my $all_greater = all @list;

my $none_greater = none @list;

my $all_greater = notall @list;

6、一次遍歷多個列表

一般我們同時遍歷多個業務相關的列表時,往往用陣列下標遍歷:

複製**

**如下:

my @a = ( ... );

my @b = ( ... );

my @c;

foreach my $i ( 0 .. $#list )

看下面這個,你的感覺是?

複製**

**如下:

use list::moreutils qw(pairwise);

my @c = pairwise @a, @b;

pairwise只適合兩個列表的同步計算,三個後用each_array:

複製**

**如下:

use list::moreutils qw(each_array);

my $ea = each_array( @a, @b, @c );

my @d;

while ( my ( $a, $b, $c ) = $ea->() )

雖然還是有點煩,不過也還好了。

7、陣列合併

合併多個陣列的操作當然你可以自己寫,但終究不如moreutils的mesh方便:

複製**

**如下:

use list::moreutils qw(mesh);

my @odds = qw/ 1 3 5 7 9/;

my @evens= qw/ 2 4 6 8 0/;

my @nums = mesh @odds, @evens; # print: 1 2 3 4 ...

PERL的陣列操作

此次我們說下,關於perl中陣列的頭尾操作,當然這是在不使用索引的情況下,類似與彙編當中,push和pop是在尾部,或者說在陣列的右邊進行的新增或者刪除操作,演示 如下 array 5.9 fred pop array 原陣列array中是 5 6 7 8 9,pop之後則是5 6 7 8 prin...

perl的陣列操作

list b 生成連續的一列數字或字母 b my numbers 1.100 my chars a.z b 新增或者刪除元素 b shift 移除陣列的第乙個元素 unshift 新增乙個元素到陣列的最後 push 新增乙個元素到陣列的第乙個元素 pop 去除陣列的最後乙個元素。table func...

Perl中的陣列操作

1 陣列的長度 如果把陣列變數賦值給標量變數,那麼賦給標量變數的就是陣列的長度 a array 標量變數 a中存放的是陣列 array的長度,即 陣列中元素的個數 a,b,c 1,2,3 則把1賦值給 a,把2賦值給 b,把3賦值給 c 陣列中的最後乙個元素的下標索引由陣列的特殊變數 arrayna...