最近工作任务繁重,就见缝插针学一点写一点。大牛轻拍
注:本文以Intermediate Perl为教学书,个人解读,有误之处,请不吝雅正。博文里的pN代表书中的第N页码。
列表操作符(list operators)之grep(p4)
grep解读
grep不仅是unix操作系统内置的强大文本搜索工具(见前一篇文),同时也是perl的内置列表操作符。
grep针对列表元素进行筛选,筛选的条件为"EXPR值为真"。比较unix同名命令,perl的grep筛选的方式更灵活,可以是逻辑判断,可以使代码段,可以使函数调用根据返回值判断,可以使正则。
grep的语法
-
@output = grep EXPR , @input; #list前逗号是必须的
-
或
-
@output = grep {
-
code;
-
of;
-
block;
-
} @input; #代码段,list前没有逗号
grep的工作方法
1. grep接受一个input list作为输入,将input list内的每一个元素给$_;
2. 在标量上下文,对关于$_的表达式'EXPR'求值,若EXPR为真,将$_输出给output list;
3. ”遍历-求值”完成后,输出output list;
grep例程
基本筛选:找出奇数
-
## find out the odd num
-
my @in = ( 1..10 );
-
my @out_1 = grep $_ % 2 , @in;
-
print "@out_1\n"; #1 3 5 7 9
基于正则的筛选:找出以大写开头的字串
-
## find out the strings beginning with a A-Z
-
my @out_5 = grep /^[A-Z]/ , qw#Micheal jane Jackson#;
-
print "@out_5\n"; # Micheal Jackson
grep中的$_不仅是临时变量,而且是@input元素的别名(alias),修改$_的值同时会改变列表元素:每个元素+2
-
# $_ is the alias of the input list
-
@in = 1..3;
-
my @out_3 = grep $_+=2 , @in;
-
print "@in\n"; #3 4 5
EXPR测试表达式可以替换为代码段(Block of codes),最后执行的表达式值为返回值:找出能够被三整除的数
-
## find out which num can be divided by 3
-
my @out_4 = grep {
-
my @digits = split // , $_; #分割数字num每个位digits
-
my $sum;
-
$sum += $_ for @digits;
-
$sum % 3 == 0 ; # a testing evaluation
-
} ( 80 .. 100 ); # there is no comma between the block and the list
-
#81 84 87 90 93 96 99
grep的用途都可以用foreach来等价完成
-
#找出奇数
-
my @out_6;
-
for(1..10){
-
push @out_6 , $_ if $_ % 2;
-
}
阅读(3804) | 评论(0) | 转发(0) |