用List::Util 和 List::MoreUtils 简化列表处理
1.快速查找最大值,最小值
use List::Util qw(max min) ; my $max_number = max ( 0 .. 1000 ); my $min_number = min (0 .. 1000 );
此外还有maxstr子程序能返回列表中最大的字符串,minstr子程序返回列表中最小的字符串
use List::Util qw(maxstr); my $max_string = maxstr(qw(Fido Spot Rover));
sum子程序所有数字求和
use List::Util qw(sum); my $sum = sum ( 1.. 1000) ;
2.列表归并
$foo = reduce { $a < $b ? $a : $b } 1..10 # min $foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz' # minstr $foo = reduce { $a + $b } 1 .. 10 # sum $foo = reduce { $a . $b } @bar # concat
3. 判断是否有元素匹配
纯粹用Perl实现的话,找出列表中的第一个符合某项条件的元素,比找出所有符合条件的要麻烦一些。
first子程序就是为了解决这样的问题而设计的,并且会告诉第一个元素是什么。一旦找到答案理解停止。
$foo = first { defined($_) } @list # first defined value in @list $foo = first { $_ > $value } @list # first value in @list which # is greater than $value
4.一次遍历多个列表
@a = (1 .. 5); @b = (11 .. 15); @x = pairwise { $a + $b } @a, @b; # returns 12, 14, 16, 18, 20 # mesh with pairwise @a = qw/a b c/; @b = qw/1 2 3/; @x = pairwise { ($a, $b) } @a, @b; # returns a, 1, b, 2, c, 3
对于三个及以上的列表可选用each_array 子程序
my $ea = each_array(@a, @b, @c); while ( my ($a, $b, $c) = $ea->() ) { .... }
5.数组合并
@x = qw/a b c d/; @y = qw/1 2 3 4/; @z = mesh @x, @y; # returns a, 1, b, 2, c, 3, d, 4 @a = ('x'); @b = ('1', '2'); @c = qw/zip zap zot/; @d = mesh @a, @b, @c; # x, 1, zip, undef, 2, zap, undef, undef, zot