Perl:巧用函数处理数组(二)

七月 9, 2012

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

 

posted in Perl by billzt

Follow comments via the RSS Feed | Leave a comment | Trackback URL

说点什么

5 评论 在 "Perl:巧用函数处理数组(二)"

提醒
排序:   最新 | 最旧 | 得票最多
游客

Perl和系统结合的真紧。
不过单纯处理上,Python要优雅一点~

游客

@Mucid, 如果有精力,打算再多学几门语言

游客

@billzt, 支持~

游客

@Mucid, “和系统结合的紧”,你是怎么看出来的?

游客

@billzt, 也没啥,很Unix的风格。

wpDiscuz
 

Copyright © 2010-2017 | Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org