加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl map函数

发布时间:2020-12-16 00:19:04 所属栏目:大数据 来源:网络整理
导读:Perl里面的map,是一种道具,可以让你的函数或者表达式,很方便地施用到一系列对象上去。 1. 让我们先看map的语法 map BLOCK LIST map EXPR,LIST BLOCK是一个用{}包围的代码块。EXPR可以是子函数名、正则表达式等。LIST是输入列表。 简单地说,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的返回值是用方括号操作符号构造匿名数组实现的。理解这一点就容易看懂代码了,这个匿名数组法常常被用来构造简单难懂的代码,常用伎俩:-)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读