7个perl数组高级操作技巧分享
1、去除一个数组中的重复元素:
使用grep函数代码片段:
代码:
my@array=('a','b','c','a','d',1,2,5,1,5); my%count; my@uniq_times=grep{++$count{$_}<2;}@array;
使用转换hash代码片段:
代码:
my@array=('a','b','c','a','d',1,2,5,1,5); my%saw; @saw{@array}=(); my@uniq_array=sortkeys%saw;
2、合并两个array:
push@array1,@array2;
3、快速查找最大值,不知道的程序猿们,这样搞:
my@nums=0..1000; my$max=$nums[0]; foreach(@nums){ $max=$_if$_>$max; }
知道的这样搞:
useList::Utilqw(max); my$max_num=max(0..1000);
知道的他们还这样搞:
useList::Utilqw(maxstr); my$max_str=maxstr(qw(FidoSpotRover));
字符串比较玩弄于掌中。还有sum:
useList::Utilqw(sum); my$sum=sum(1..1000);
4、列表归并
数字求和,也可以用List::Util中的reduce:
useList::Utilqw(reduce); my$sum=reduce{$a+$b}1..1000;
与sort类似,reduce也是用codeblock作为参数,不过运行机制稍微不同。每次迭代,先从参数列表取出前面两个元素,分别设置为别名$a和$b,这样参数列表的长度就会缩短为两个元素。然后reduce把语句块返回的计算结果再压回到参数列表的头部。如此往复,直到最后列表里只剩下一个元素,也就是迭代的计算结果$sum。
好了,可以这样了:
my$product=reduce{$a*$b}1..1000;
5、判断是否有元素匹配
纯粹用Perl实现,找到列表中第一个符合某条件的元素,比找出所有符合条件的要麻烦一些。下面的例子,判断是否有大于1000的元素:
my$found_a_match=grep{$_>1000}@list;
注意:如果@list有一亿个元素,而要找的就是1001?grep仍然还会循环一亿次,当然你可以向下面自己控制下:
my$found_a_match=0; foreachmy$elem(@list){ $found_a_match=$elemif$elem>1000; lastif$found_a_match; }
还是那句话,不简单~~~List::Util有现成的东西:
useList::Utilqw(first); my$found_a_match=fist{$_>1000}@list;
在List::MoreUtils模块中,也提供很多的实用函数:
my$found_a_match=any{$_>1000}@list; my$all_greater=all{$_>1000}@list; my$none_greater=none{$_>1000}@list; my$all_greater=notall{$_%2}@list;
6、一次遍历多个列表
一般我们同时遍历多个业务相关的列表时,往往用数组下标遍历:
my@a=(...); my@b=(...); my@c;
foreachmy$i(0..$#list){ my($a,$b)=($a[$i],$b[$i]); push@c,$a+$b; }