Perl List::Util模块使用实例
在Perl中有一些专门用于处理列表数据的模块,比如说List::Util模块,该模块包含在标准库中,能提供各种高效的常见列表处理工具。因其用C语言来实现,速度一般都挺快!
【例01】扫描符合条件的某个列表,并取出第一个符合条件的
常规做法:
use5.010; my@names =qw(WendyJerryBettyWendyAlice); foreach (@names){ if(/\bWendy\b/i){ $match=$_; last; } } say$match;
如果改用List::Util模块提供的first子程序,就要简单的多
useList::Utilqw(first); my$match=first{/\bWendy\b/i}@names; #找到第一个Wendy即终止 如果换成数字的话,比如要求
【例02】求1到1000之间的和
常规做法:
use5.010; my$total=0; foreach(1..1000){ $total+=$_; } say$total; #结果500500
如果改用List::Util模块提供的sum子程序,同样很简单:
useList::Utilqw(sum); my$total=sum(1..1000);#结果500500
【例03】求一组数字的最大值与最小值.
常规做法:
#!/usr/bin/perl; useutf8; submax{ my($max_so_far)=shift@_;#数组中第一个值,暂时当成最大值。 foreach(@_){ #遍历数组@_ if($_>$max_so_far){ #看其它元素是否有比$max_so_far大的值。 $max_so_far=$_;} #如果有话,更新最大值变量 } $max_so_far; } my$_MaxData=&max(2,3,8,5,10); print$_MaxData; #结果为10
如果改用List::Util模块提供的max子程序,则非常简单:
useList::Utilqw(max); my$max=max(2,3,8,5,10); print$max; #结果为10
同样道理,使用List::Util模块提供的min子程序,可求最小值:
useList::Utilqw(min); my$min=min(2,3,8,5,10); #最小值为2
【例04】对一组字符串进行排序
如果用常规方法的话,必须按顺序一个个进行比较,用List::Util的maxstr子程序可以轻松实现:
useList::Utilqw(maxstr); my $max_str=maxstr(qw/JerryBettyAliceFredBarneyjerry/); print$max_str;
【例05】对列表中的元素随机排序
如果用常规方法的话,很难实现,而用List::Util中的shuffle子程序,则非常简单,一条命令搞定!
useList::Utilqw(shuffle); my@shuffled_nums=shuffle(1..10); #39856411027 my@shuffled_name=shuffle('A'..'G');#FEGABD
【例06】检查列表中是否没有某个元素,或者有任何元素,或者所有元素都符合条件。支持类似grep语法
如果用常规方法的话,很难实现,而用List::MoreUtils同样很容易实现,代码如下:
useList::MoreUtilsqw(noneanyall); my@numbers=qw(741378); if(none{$_>100}@numbers){print"Noelementsover100\n";} elsif(any{$_>50}@numbers){print"Someelementsover50\n";} elsif(all{$_<10}@numbers){print"Allelements<10\n";} NOTE:List::MoreUtils非自带的模块,需要下载.
【例07】同时处理多个姓名列表,每次取出2位
useList::MoreUtilsqw(natatime); my@names_1=qw(AliceBobCarly); my@names_2=qw(DavidEdwardFoo); my$names =natatime(2,@names_1,@names_2); #natatim(Natatime:同时处理N组)有多个列表的话往里面放就好了 while(my@name=$names->()){ #遍历,方便后面输出 print"Got@name\n"; } #输出结果 GotAliceBob GotCarlyDavid GotEdwardFoo
【例08】合并多个列表为一个列表
useList::MoreUtilsqw(mesh); my@array_1='A'..'D'; my@array_2=1..4; my@array_3=qw(jerryalicewendy); my@array_new=mesh(@array_1,@array_2,@array_3); print@array_new; #输出结果: A=>1=>jerry=>B=>2=>alice=>C=>3=>wendy=>D=>4
第1次:第一个列表中取A,第二个列表中取出1,第三个列表中取出jerry
第2次:第一个列表中取B,第二个列表中取出2,第三个列表中取出alice
......
依次类推!
【例09】往指定的字符串中加字符
可以用List::MoreUtils中的insert_after子程序
usev5.10; useList::MoreUtilsqw(:all); my@list=qw/Thisisalist/; insert_after{$_eq'a'}"longer"=>@list; print@list; #Thisisalongerlist
【例10】对两个列表进行操作,第一个列表平方后,和第二个列表求和
可以用List::MoreUtils中的pairwise子程序
usev5.10; useList::MoreUtilsqw(:all); @m=(1..4); @n=(100..103); @x=pairwise{($a*$a)+$b}@m,@n; #101105111119
【总结】
如果上面的方式用普通的方法实现,需要多次循环遍历,很麻烦,而将复杂的算法,数据结构用C来实现并封装在List模块中,则可以实现很多看似复杂的功能,从中也可以看出Perl的强大之处在于CPAN,有众多的模块支撑!