Chinaunix首页 | 论坛 | 博客
  • 博客访问: 132511
  • 博文数量: 28
  • 博客积分: 527
  • 博客等级: 中士
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-09 17:05
个人简介

运维开发工程师。致力于网络,WEB应用服务,Linux系统运维。方向:操作系统,监控,自动化

文章分类

全部博文(28)

文章存档

2013年(12)

2012年(16)

分类: Python/Ruby

2012-11-26 23:56:54

最近工作任务繁重,就见缝插针学一点写一点。大牛轻拍
注:本文以Intermediate Perl为教学书,个人解读,有误之处,请不吝雅正。博文里的pN代表书中的第N页码。
列表操作符(list operators)之grep(p4)

grep解读
grep不仅是unix操作系统内置的强大文本搜索工具(见前一篇文),同时也是perl的内置列表操作符。
grep针对列表元素进行筛选,筛选的条件为"EXPR值为真"。比较unix同名命令,perl的grep筛选的方式更灵活,可以是逻辑判断,可以使代码段,可以使函数调用根据返回值判断,可以使正则。

grep的语法
  1. @output = grep EXPR , @input; #list前逗号是必须的

  2. @output = grep { 
  3. code;
  4.         of;
  5.         block;
  6.         } @input; #代码段,list前没有逗号
grep的工作方法
1. grep接受一个input list作为输入,将input list内的每一个元素给$_;
2. 在标量上下文,对关于$_的表达式'EXPR'求值,若EXPR为真,将$_输出给output list;
3. ”遍历-求值”完成后,输出output list;

grep例程
基本筛选:找出奇数
  1. ## find out the odd num
  2. my @in = ( 1..10 );
  3. my @out_1 = grep $_ % 2 , @in;
  4. print "@out_1\n"; #1 3 5 7 9
基于正则的筛选:找出以大写开头的字串
  1. ## find out the strings beginning with a A-Z
  2. my @out_5 = grep /^[A-Z]/ , qw#Micheal jane Jackson#;
  3. print "@out_5\n"; # Micheal Jackson
grep中的$_不仅是临时变量,而且是@input元素的别名(alias),修改$_的值同时会改变列表元素:每个元素+2
  1. # $_ is the alias of the input list
  2. @in = 1..3;
  3. my @out_3 = grep $_+=2 , @in;
  4. print "@in\n"; #3 4 5
EXPR测试表达式可以替换为代码段(Block of codes),最后执行的表达式值为返回值:找出能够被三整除的数
  1. ## find out which num can be divided by 3
  2. my @out_4 = grep {
  3.         my @digits = split // , $_; #分割数字num每个位digits
  4.         my $sum;
  5.         $sum += $_ for @digits;
  6.         $sum % 3 == 0 ; a testing evaluation
  7.         } ( 80 .. 100 ); # there is no comma between the block and the list
  8. #81 84 87 90 93 96 99
grep的用途都可以用foreach来等价完成
  1. #找出奇数
  2. my @out_6;
  3. for(1..10){
  4.         push @out_6 , $_ if $_ % 2;
  5. }
阅读(3744) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~