m//用来查找匹配的行或者多行;
s/a/b/寻找a,并用b替换
s///g g修饰符告诉解析器将替换所有匹配符
s/\s+/ /g 去掉一行中多余的空白,用一个空格代替。
i x s可以继续用来修饰s操作。
配对符号可以是其它的样子:
s{foo}{bar}
s#bar#
大小写转换的修饰符
s/(bar)/\U$1/gi 替换所有bar(不区分大小写)为BAR,\U大写,\L转成小写
\u \l只作用于后面一个字符,s/(bar),(foo)/\U$2\E,$1/gi 很复杂的例子,调换$1 $2的位置,并且将$2转换成大写;\E的作用是防止\U的作用继续传染;
s/(bar),(foo)/\U\l$2\E,$1/gi 转换成Foo,bar
split操作
@arr=split/:/,"::ddd:fc:"; 默认情况下,开始的空白留下,末尾的空白丢失
默认时,split的操作对象是$_,分隔符是/\s+/
跟split 相反的操作是join
$_=join" ",@arr;
将arr中的元素用空格分开join到一个标量中去。
将$1 $2 等自动保存到列表
@lines=(/([a-z]+)/ig); 保存匹配的字符串到列表里
%hash_table=(/(\w+)\S+(\w+)/g);
以下几行代码获得输入的hash列表
while(($_=<STDIN>)){ if(/(\w+)\s+(\w+)/g){ $hash_table{$1}=$2; } }
foreach (sort keys %hash_table){ print "$_ => $hash_table{$_}\n"; }
|
贪婪的数量词*
/bar(.*)foo/ 试图寻找bar foo之间的内容,但是.*本身能匹配foo所以,会采取回退的方式搜索最后一个foo和bar之间的内容。这是程序想要的结果嘛?
可以用.*?代替上面的操作,?告诉解析器搜索最近一个foo即可,每次匹配一个.之后就查看接下来的字串是否匹配foo。
可以处理多行的字串
/^bar\b/im /m选项告诉解析器,输入可能是一个多行字串,匹配第一个词是bar(不区分大小写)的行。
open($fh,") || die $!; $lines=join "",<$fh>; #读入所有行并合并到lines里 $lines=~s/^/readme.txt:/gm; #为每一行加上文件名
|
为文件中的每一行前面加上文件名。
阅读(1203) | 评论(0) | 转发(0) |