Perl基本的模式匹配有两种:
m/pattern/ //只匹配
s/pattern/replacement/ //匹配并替换
其中分隔符反斜杠/可以用任意特殊字符替换(但在m/pattern/简写为/pattern/时不能这样做,换种说法,即若分隔符是反斜杠/,则m/pattern/可简写为/pattern/)模式匹配若成功,则返回true,否则返回false
模式匹配默认的目标变量是$_,如
while(<FILEHANDLE>){
print "match/n" if(/pattern/);
}
上面代码的作用是将文件的每一行与pattern匹配,若匹配成功,则打印输出match
若要指定模式匹配的目标变量,应使用运算符=~,若匹配则运算结果为true,否则为false,如
$a = "hello world";
print "match/n" if($a =~ /hello/);
s/pattern/replacement/在匹配成功后,会替换匹配的部分并赋给目标变量,如
$a = "hello world";
$a =~ s/hello/hi/; //$a的值变为"hi world"
两个特殊模式:
- 在模式匹配尾部加i可使匹配时忽略大小写,即/pattern/i
- 在模式匹配尾部加g可使模式匹配中圆括号覆盖的部分被赋值给固有变量$1,$2,...(还有其他功能,此处略)
grep的格式如下
grep expression, list
grep迭代运行list中的每个元素,然后执行expression。在expression中,$_代表list中的元素。若expression返回为真,grep就返回该元素。如
@dogs = qw(greyhound bloodhound terrier mutt chihuahua);
@hounds = grep /hound/, @dogs;
上面代码中,@dogs是list,$_代表@dogs中的每个元素,通过模式/hound/匹配,若匹配成功,则grep返回这个元素,并添加到数组@hounds中
Tips:grep不一定要与模式匹配共用,如
@longdogs = grep length($_)>8, @dogs;
上面代码将@dogs中长度大于8的元素放在@longdogs中
Regular Expression中的特殊字符类
- /w:一个单词字符,等价于[a-zA-Z0-9_]
- /W:一个非单词字符
- /d:一个数字,等价于[0-9]
- /D:一个非数字
- /s:一个空白字符,等价于[/t/f/r/n]
- /S:一个非空白字符