perl 函数处理数组的实例(二)

发布时间:2019-08-14编辑:脚本学堂
perl的核心库中有个 List::Util 模块,在上一篇文章中我们已提及过。此外,在CPAN上还有一个更加高级的模块:List::MoreUtils(注意,是复数,后面有个s哦!)

    perl的核心库中有个 List::Util 模块,在上一篇文章中我们已提及过。此外,在CPAN上还有一个更加高级的模块:List::MoreUtils(注意,是复数,后面有个s哦!)它可以看成是 List::Util 的强化版本,能更加方便地处理各种数组问题。这种模块在小驼书里面是不会讲的,在《Perl 最佳实践》这本书里面有所提及。

(1)删除数组中的重复元素
比如,一个数组是(1,6,5,0,6,2,0,7,7,8),现在要求:重复出现的元素只保留一个,其它删掉,并且数组顺序不变,结果应该是(1,6,5,0,2,7,8),该怎么做?
网上的做法基本上是基于 grep 版本的:
 

复制代码 代码如下:
my @array = (1,6,5,0,6,2,0,7,7,8);
my %count;
my @uniq_array = grep { ++$count{ $_ } < 2 } @array;

其实比这更加简单的做法是直接调用 List::MoreUtils 模块里面的 uniq 函数:
 

复制代码 代码如下:
use List::MoreUtils qw/uniq/;
my @array = (1,6,5,0,6,2,0,7,7,8);
my @uniq_array = uniq @array;      # 得到 1,6,5,0,2,7,8

是不是很简单呢?!

(2)找出数组中某个元素所在的位置
继续上面那个数组(1,6,5,0,6,2,0,7,7,8),现在要找出元素 6 所在的位置(应该是第 1 和第 4 位,数组的第一个元素看成第 0 位)。方法是调用以下几个函数:
first_index:找出符合条件的第一个元素所在的位置
last_index:找出符合条件的最后一个元素所在的位置
indexes:找出符合条件的所有元素所在的位置,因为可能有很多个元素,所以它返回一个列表(哪怕其实只有一个元素符合条件)

它的写法是(以 first_index 为例):
 

复制代码 代码如下:
first_index { $_ 的条件 } @array

可见这与 grep 和 map 函数很像!只不过 grep 和 map 返回的是数组的元素列表,而这里返回的是元素的索引(列表)罢了。

如果只想找到第一个出现 6 的位置,就这么写:
 

复制代码 代码如下:
use List::MoreUtils qw/first_index/;
my @array = (1,6,5,0,6,2,0,7,7,8);
my $first_index_for_6 = first_index { $_==6 } @array;       # 得到 1

如果想找到所有出现 6 的位置,就这么写:
 

复制代码 代码如下:
use List::MoreUtils qw/indexes/;
my @array = (1,6,5,0,6,2,0,7,7,8);
my @indexes_for_6 = indexes { $_==6 } @array;     # 得到 1,4

通过这种方法,我们可以很轻松地找到数组中最小值所在的位置
 

复制代码 代码如下:
use List::Util qw/min/;
use List::MoreUtils qw/indexes/;
my @array = (1,6,5,0,6,2,0,7,7,8);
my @indexes_for_min = indexes { $_==min(@array) } @array;     # 得到 3,6