本文主要介绍七种perl数组高级操作技巧。本文介绍了阵列重复数据消除、阵列合并、寻找最大值、列表合并等。有需要的可以参考一下。
1、去除一个数组中的重复元素:
使用grep函数的代码片段:
代码:
复制代码如下:
my @array=( a , b , c , a , d ,1,2,5,1,5);
我的%计数;
my @ uniq _ times=grep { $ count { $ _ } 2;} @ array
使用转换哈希代码段:
代码:
复制代码如下:
my @array=( a , b , c , a , d ,1,2,5,1,5);
我的%锯;
@ saw { @ array }=();
my @ uniq _ array=sort keys % saw
2、合并两个array:
复制代码如下:
推@array1,@ array2
3、快速查找最大值,不知道的程序猿们,这样搞:
复制代码如下:
我的@nums=0.1000;
my $ max=$ nums[0];
foreach (@nums) {
$ max=$ _ if $ _ $ max
}
知道这个:
复制代码如下:
use List:Util qw(max);
我的max _ num=max(0.1000 );
知道他们仍然这样做:
复制代码如下:
使用List:Util qw(maxstr);
my $ max _ str=maxstr(qw(Fido Spot Rover));
字符串比较尽在掌中。和总和:
复制代码如下:
使用List:Util qw(sum);
我的$sum=sum ( 1.1000 );
4、列表归并
对数字求和,或者在List:Util中使用reduce:
复制代码如下:
使用List:Util qw(reduce);
my $sum=reduce { $a $b } 1.1000;
与sort类似,reduce以代码块为参数,但运行机制略有不同。在每次迭代中,前两个元素取自参数列表,并分别设置为别名$a和$b,这样参数列表的长度将缩短为两个元素。然后reduce将语句块返回的计算结果压回到参数列表的开头。以此类推,直到最终列表只剩下一个元素,即迭代计算结果$sum。
好了,我们开始吧:
复制代码如下:
我的$product=reduce { $a * $b } 1.1000;
5、判断是否有元素匹配
用纯Perl找到列表中满足某个条件的第一个元素比找出所有条件更麻烦。以下示例确定是否有大于1000的元素:
复制代码如下:
my $ found _ a _ match=grep { $ _ 1000 } @ list;
注:如果@list有1亿个元素,你要找的是1001个怎么办?Grep还是会循环1亿次。当然,你可以把它控制在下面:
复制代码如下:
我的$ found _ a _ match=0;
foreach my $elem (@list) {
$ found _ a _ match=$ elem if $ elem 1000;
last if $ found _ a _ match
}
还是那句话,不简单~~~List:Util有现成的:
复制代码如下:
使用List:Util qw(first);
我的$ found _ a _ match=fist { $ _ 1000 } @ list;
在List:MoreUtils模块中,还提供了许多实用函数:
复制代码如下:
我的$ found _ a _ match=any { $ _ 1000 } @列表;
我的$ all _ greater=all { $ _ 1000 } @列表;
我的$ none _ greater=none { $ _ 1000 } @列表;
我的$ all _ greater=notall { $ _ % 2 } @列表;
6、一次遍历多个列表
通常,当我们同时遍历多个与业务相关的列表时,我们经常使用数组下标来遍历:
复制代码如下:
我的@a=(.);
我的@b=(.);
我的@ c;
对于每个我的$i ( 0.$#list ) {
我的($a,$b )=( $a[$i],$ b[$ I]);
推送@c,$ a $ b;
}
看下面。你怎么想呢?
复制代码如下:
使用List:MoreUtils qw(成对);
my @c=pairwise { $a $b } @a,@ b;
Pairwise只适合两个列表的同步计算,each_array用在三个之后:
复制代码如下:
使用List:more utils qw(each _ array);
my $ea=each_array( @a,@b,@ c);
我的@ d;
while(我的$a,$b,$ c)=$ ea-(){
推送@d,$ a $ b $ c;
}
还是有点烦,不过还好。
7、数组合并
当然,你可以自己编写合并多个数组的操作,但毕竟没有MoreUtils的mesh方便:
复制代码如下:
使用List:more utils qw(mesh);
我的@ odds=qw/1 3 5 7 9/;
my @ evens=qw/2 4 6 8 0/;
my @nums=mesh @odds,@ evens#打印:1 2 3 4.