Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1522107
  • 博文数量: 289
  • 博客积分: 11086
  • 博客等级: 上将
  • 技术积分: 3291
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-22 17:06
个人简介

徐小玉的博客。

文章分类

全部博文(289)

文章存档

2023年(6)

2022年(1)

2021年(2)

2020年(9)

2019年(9)

2018年(6)

2017年(10)

2016年(10)

2014年(3)

2013年(4)

2011年(12)

2010年(16)

2009年(14)

2008年(119)

2007年(48)

2006年(20)

我的朋友

分类:

2008-04-01 11:05:22

因为我写的perl代码都有可能因为追求性能而用C改写,所以很多时候都有意识地不去用perl的一些特有功能,其中就有功能强大的map。

如果是魔法门英雄无敌的玩家,就很容易理解什么是map. 在英雄无敌里,当英雄的魔法技能达到专家级别时,可以使用一些群体魔法,例如土系的群体减速、气系的群体加速、群体气盾、连环闪电、火系的大火球和流星雨等。可是相应的魔法系的等级未到之前,就只能很委屈地对单个生物使用魔法。Perl里面的map, 是一种道具,可以让你的魔法,哦不,是函数或者表达式,很方便地施用到一系列对象上去。

1. 让我们先看map的语法

map BLOCK LIST
map EXPR, LIST

BLOCK是一个用{}包围的代码块。EXPR可以是子函数名、正则表达式等。LIST是输入列表。

简单地说,map就是起了一个替代foreach循环的作用,map会把数组LIST中的元素挨个取出,放到系统变量$_中,然后调用BLOCK去处理。值得强调的是,除非有很特殊的理由,不要去修改$_的值,因为修改$_就是直接改了原始数组里的元素!BLOCK 处理过的结果由map返回,仍然是一个数组。

2. 一个例子:计算一系列文件大小

my @sizes = map { -s $_ } @filenames;

上面例子用-s操作取得一些文件的大小,存到数组中去。

3. 是不是说map函数的输入数组和输出数组一定等长呢?不一定的,看这个

my @books = ( 'Pride and Prejudice', 'Emma', 'Masfield Park', 'Sense and Sensibility', 'Nothanger Abbey', 'Persuasion', 'Lady Susan', 'Sanditon', 'The Watsons');

现在取出书名里面所有用到的单词,并且全部转换成大写

my @words = map { split( /\s+/, $_)} @books;
my @uppercases = map uc, @words;

在split起过作用之后,当然@words的长度要比@books长了。

4. 再举一个map嵌套使用的例子:矩阵的转置


  use Data::Dumper();
  my @matrix = ( [a, b, c, d], [e, f, g, h], [i, j, k, l] );
  print Dumper(\@matrix );
  my @transposed = map { $x = $_;
      [ map { $matrix[$_][$x] } 0 .. $#matrix ];
                       } 0 .. $#{$matrix[0]};
  print Dumper(\@transposed);


上面的BLOCK里面,map的返回值是用方括号操作符号构造匿名数组实现的。理解这一点就容易看懂代码了,这个匿名数组法常常被用来构造简单难懂的代码,常用伎俩:-)

阅读(1303) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~