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 = 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 ...

(0)

相关推荐

  • 解析posix与perl标准的正则表达式区别

    正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式.正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用 来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本 内容.许多程序设计语言都支持利用正则表达式进行字符串操作.例如,在Perl中就内建了一个功能强大的在正则表达式引擎.正则表达式这个概念最初是由 Unix中的工具软件(例如sed和g

  • perl查找进程PID的例子

    主要是利用查找/proc目录下的相关文件进行查找. #!/usr/bin/perl use strict; use warnings; #usage: process_grep.pl ProcessName exit( main(@ARGV) ); sub main { my $Phash; my $ProcessName = shift; my $PROC_DIR = "/proc"; chdir $PROC_DIR; my @pids = glob "[0-9]*&quo

  • Perl内置特殊变量总结

    [ 文件句柄 ] $| 如果非零, 则在对当前选定的文件执行写或打印操作后强制清除缓冲区$% 当前选中文件句柄的当前页码$= 当前选中文件句柄的当前页面长度$- 当前选中文件句柄的页面剩余长度$~ 当前选中文件句柄的报表格式名称$^ 当前选中文件句柄的当前页眉格式名 [ 全局变量 ] $_ 默认的输入和模式搜索空间$@ 上一个 eval.do 或 require 函数产生的错误消息$/ 输入记录的分隔符, 默认为换行符(类似于 awk 中的 RS)$\ 打印函数的输入记录分隔符. 除非设置了 $

  • Windows和Linux系统下perl连接SQL Server数据库的方法

    本文将提供一些perl连接Microsoft SQL Server数据库的实例.perl脚本运行在Windows和Linux平台. Windows平台 如果在Windows平台下运行perl脚本,建议使用依赖DBI的两个模块包,提供标准的数据库接口模块. DBD::ODBC DBD::ADO 使用DBD::ODBC 如果选用DBD::ODBC,下面的实例代码将展示如何连接到SQL Server数据库: 复制代码 代码如下: use DBI;   # DBD::ODBC   my $dsn = '

  • perl中my和our的区别分析

    perl中our的用法require 5.006当版本号小于 5.006 的时候,会返回失败,从而导致模块加载失败.所以它的作用就是保证模块调用环境的 Perl 版本. our 和 my 一样,都是对变量的声明,不过 our 声明的是包全局变量,而 my 声明的是词法变量. 不过,经过 our 声明的变量,它会变得像一个词法变量一样,其实这也是 our 存在的目的:用来欺骗 strict pragma,使 strict 以为它是一个词法变量,其实却不是. 有一个简单的办法可以理解 our:1,你

  • Perl Substr()函数及函数的应用

    perl substr()函数例子,substr()函数实例代码 - 返回EXPR的子字符串,起始是为字符串内的偏移量OFFSET. 语法: substr EXPR, OFFSET, LEN, REPLACEMENT substr EXPR, OFFSET, LEN substr EXPR, OFFSET 定义和用法 返回EXPR的子字符串,起始是为字符串内的偏移量OFFSET.如果OFFSET为负,开始有很多的字符结尾的字符串.如果LEN指定,返回的字节数,或所有的字节,直到结束的字符串(如果

  • Perl调用shell命令方法小结

    一.systemperl也可以用system调用shell的命令,它和awk的system一样,返回值也是它调用的命令的退出状态. 复制代码 代码如下: [root@AX3sp2 ~]# cat aa.pl#! /usr/bin/perl -w$file = "wt.pl";system("ls -l wt.pl");$result = system "ls -l $file";print "$result \n"; #输出命

  • Perl函数(子程序)学习笔记

    一.函数定义 子程序即一段分离的代码,它可以使减少重复代码且程序易读.perl中,子程序可以出现在程序的任何地方.但一般放在程序的开始或结尾. 复制代码 代码如下: sub subroutine{     statements; } sub开始,子程序名同变量的命名规则,可与变量同名,最好不要与内部函数同名,如果与内部函数同名则用$subroutine区分,不用&是内部函数,用&是定义函数,但省略&时混淆. 带有原型说明的子程序定义: 复制代码 代码如下: sub subrouti

  • perl 文件测试操作符汇总

    第一篇: 复制代码 代码如下: 操作符       含义-r      文件或目录可读-w      文件或目录可写-x      文件或目录执行-o      文件或目录归用户所有-R      文件或目录对真正用户可读-W      文件或目录对真正用户可写-X      文件或目录对真正用户执行-O      文件或目录归真正用户所有-e      文件或目录存在-z      文件存在且大小为0-s      文件或目录存在且不为0(返回字节数)-l      文件为符号链接-f    

  • Perl一句话命令行编程中常用参数总结

    工作中的线上环境有很多的perl命令行的类似一句话的命令,今天总结下perl的命令行编程的一些东西. -e 后面紧跟着引号里面的字符串是要执行的命令: 复制代码 代码如下: king@king:~$ perl -e 'print "hello world \n"' hello world 如果是多个命令就可以使用多个-e,这里是不是想到了sed呢?但是要注意的是中间的哪个";". 复制代码 代码如下: king@king:~$ perl -e 'print &quo

  • 为Java程序员准备的10分钟Perl教程

    1.从基础开始 不像java,Perl不需要"main"方法作为入口点.要运行一个简单的Perl程序如下: 复制代码 代码如下: # comment starts with "#" # the name is hello.pl print "Hello Perl!"; 只需执行: perl hello.pl 2. 日期类型 在Perl中的日期类型是非常简单,它有3种类型:标量,数组和Hash. 标是一个单值,它基本上可以是任何其他比数组或哈希.

  • Perl中的正则表达式介绍

    感谢AKA及作者. Perl 中的正则表达式正则表达式的三种形式 正则表达式中的常用模式 正则表达式的 8 大原则 正则表达式是 Perl 语言的一大特色,也是 Perl 程序中的一点难点,不过如果大家能够很好的掌握他,就可以轻易地用正则表达式来完成字符串处理的任务,当然在 CGI 程序设计中就更能得心应手了.下面我们列出一些正则表达式书写时的一些基本语法规则. 9.1 正则表达式的三种形式首先我们应该知道 Perl 程序中,正则表达式有三种存在形式,他们分别是: 匹配:m/<regexp>;

  • cpanm安装及Perl模块安装教程

    cpanm是安装Perl模块的最方便的方法.自动下载安装依赖包.使用CPAN shell或下载源码包安装模块,遇到大量依赖关系,非常头痛.下面就是一例: 安装MongoDB模块 复制代码 代码如下: # perl Makefile.PL Warning: prerequisite Class::Method::Modifiers 0 not found. Warning: prerequisite Data::Types 0 not found. Warning: prerequisite Da

  • Perl使用nginx FastCGI环境做WEB开发实例

    Hello World 一个简单的hello world例子: 复制代码 代码如下: #!/usr/bin/env perluse strict;use warnings;use CGI::Fast;while(my $q = new CGI::Fast){ print $q->header("text/plain"); print "Hello World";} 和CGI的区别仅在于多了一个循环来接受请求,CGI::Fast对象和CGI接口是一样的,而且该脚

  • perl批量查询ip归属地的方法代码

    由于业务需要,要查询客户的ip地址,将部分地区的客户过滤出来,开始想到使用ip数据库,发现读取纯真数据库的难度对我来说有些大,而我目前的时间要求比较紧迫,通过在群里询问,感谢黑影子和扶凯的帮忙,推荐了IP::QQWry::Decoded这个模块,该模块是专门用来读取qqwry纯真数据库的,用起来非常简单. 复制代码 代码如下: #!/usr/bin/perluse IP::QQWry::Decoded;use Encode;use utf8;binmode(STDIN, ':encoding(u

  • Perl Sort函数用法总结和使用实例

    一) sort函数用法 sort LISTsort BLOCK LISTsort SUBNAME LIST sort的用法有如上3种形式.它对LIST进行排序,并返回排序后的列表.假如忽略了SUBNAME或BLOCK,sort按标准字串比较顺序来进行(例如ASCII顺序).如果指定了SUBNAME,它实际上是个子函数的名字,该子函数对比2个列表元素,并返回一个小于,等于,或大于0的整数,这依赖于元素以何种顺序来sort(升序,恒等,或降序).也可提供一个BLOCK作为匿名子函数来代替SUBNAM

随机推荐