7个perl数组高级操作技巧分享
作者:junjie 发布时间:2022-08-09 10:38:19
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 = sort keys %saw;
2、合并两个array:
push @array1, @array2;
3、快速查找最大值,不知道的程序猿们,这样搞:
my @nums = 0 .. 1000;
my $max = $nums[0];
foreach (@nums) {
$max = $_ if $_ > $max;
}
知道的这样搞:
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 { $a + $b } 1 .. 1000;
与sort类似,reduce也是用code block作为参数,不过运行机制稍微不同。每次迭代,先从参数列表取出前面两个元素,分别设置为别名$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;
foreach my $elem (@list) {
$found_a_match = $elem if $elem > 1000;
last if $found_a_match;
}
还是那句话,不简单~~~List::Util有现成的东西:
use List::Util qw(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;
foreach my $i ( 0 .. $#list ) {
my ( $a, $b ) = ( $a[$i], $b[$i] );
push @c, $a + $b;
}
看下面这个,你的感觉是?
use List::MoreUtils qw(pairwise);
my @c = pairwise { $a + $b } @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->() ) {
push @d, $a+$b+$c;
}
虽然还是有点烦,不过也还好了。
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 ...
猜你喜欢
- 前言之前的一篇文章已经讲过怎样获取链接,怎样获得参数了,详情请看python爬取京东商城普通篇,本文将详细介绍利用python爬虫框架scr
- 1、背景最近有个项目,需要搭建一个socket服务器,一个web服务器,然后实现两个服务器之间的通讯交互。刚开始的方案是用Python中so
- 本文实例讲述了Python实现base64编码的图片保存到本地功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -
- 用Python实现出来的机器学习算法都是什么样子呢? 前两期线性回归及逻辑回归项目已发布(见文末链接),今天来讲讲BP神经网络。BP神经网络
- 环境win10Python:3.6.7Django:2.2.7运行效果1、创建 Django 项目# 创建Download项目django-
- 前段时间自学了python,作为新手就想着自己写个东西能练习一下,了解到python编写爬虫脚本非常方便,且最近又学习了MongoDB相关的
- 这篇文章主要介绍了python StringIO如何在内存中读写str,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 一、概述使用K-means进行用户聚类划分主要的目的是实现用户画像的电影推荐系统,该推荐包括两部分,第一部分通过协同过滤实现电影推荐 ,第二
- 目录什么是信号Python的信号处理Python对信号的处理信号枚举信号函数signal.alarm(time)signal.pause()
- scrapy是目前python使用的最广泛的爬虫框架架构图如下解释:Scrapy Engine(引擎): 负责Spider、ItemPipe
- pygame.mixer是一个用来处理声音的模块,其含义为“混音器”。游戏中对声音的处理一般包括制造声音和播放声音两部分,这里仅学习了播放声
- 本文为大家分享了python链表的基础概念和基础用法,供大家参考,具体内容如下一、什么是链表链表是由多个不同的节点组成,每个节点通过指针区域
- 最近在学习OpenCV,本文主要介绍了OpenCV 绘制同心圆的示例代码,分享给大家,具体如下:功能函数// 绘制同心圆void DrawC
- 前言最近微信小游戏跳一跳大热,自己也是中毒颇久,无奈手残最高分只拿到200分。无意间看到教你用Python来玩微信跳一跳一文,在电脑上利用a
- 在这里我们将介绍的是MySQL内存使用上的线程独享,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,
- 前言谷歌出了一个开源的、跨平台的、可定制化的机器学习解决方案工具包,给在线流媒体(当然也可以用于普通的视频、图像等)提供了机器学习解决方案。
- 本文实例讲述了Python实现的文本简单可逆加密算法。分享给大家供大家参考,具体如下:其实很简单,就是把一段文本每个字符都通过某种方式改变(
- 本文实例讲述了Python实现将一个正整数分解质因数的方法。分享给大家供大家参考,具体如下:遇到一个python编程联系题目:将一个正整数分
- 问题:最新在爬取某站点的时候,发现在post请求当中,参数构造正确却获取不到数据,索性将post的参数urlencode之后放到post请求
- 闭包account=0def atm(num,flag): global account