用s///进行替换
m//意思是查找 而s///意思是查找并替换
#s///模式
s/需要匹配的/把匹配的替换的/
#用/g进行全局替换
如
=”home,sweethome”;s/home/cave/g;print”
_\n”; #输出结果为cave, sweet cave
如缩减空白
$_="pp dd aad aad";
s/\s+/ /g;
print"$_"; #将任何连续空白转换为单一空格
#不同的定界符
如
s{ }{ };
s ;
s{ }[ ];
等
#可替换修饰符
除了修饰符/g,还可以使用匹配模式中的 /i /x /s 修饰符
联合使用无需无需关心前后顺序
如
s{ }{ }gi;
#绑定操作符
#无损替换
若既要替换前的字符串 又要替换后的字符串
(my
copy=
ori)=~s/ / /;
#大小写转换
转义符\U会把它后面所有字符转换成大写 \u会把它紧跟其后的第一个字符转换成大写
\L 所有 小写 \l 第一个 小写
#split操作符
给定模式拆分字符串
如
a=”babbabbbabbbb”;@part=split/a/,
a; #得到”b”,”bb”,”bbb”,”bbbb”
split/ /中写成可匹配的模式
#join函数
$new=join 任意字符串,一串片段;
#列表上下文中的m//
比split更灵活
=”saadve”;my(
a,
b,
c)=m/(\s+)(\s+)(\s+)/;
print”
aisnext
b”;
##更强大的正则表达式
#非贪婪量词
之前出现的四种量词 * + ? {} 都是贪婪量词
就是尽可能长得匹配
而非贪婪量词的写法是在四种贪婪量词后面加上问号?
即 *? +? ?? {}?
就是尽可能短得匹配
#跨行的模式匹配
传统的正则表达式仅用来匹配单行文本
而若要匹配多行文本
首先变量要写成
$_=”cwe\ncewc\ncwec\n”; #这就是一个三行文本
见第八章 ^ $ 都是表示字符串开头锚位和字符串结尾锚位 更严谨的绝对锚位是\A \z
而在后面加上m模式,就可以匹配每一行的头尾
如
print"我在行开头找到了字母c" if /^c/m;
#一次更新多个文件
#从命令行直接编辑——————————单行代码解决问题————————cmd?
假如要更新上百个文件,把里面拼错的Randall改为Randal
可以用单行代码一步完成
$ perl -p -i.bak -w -e 's/Randall/Randal/g' fred*dat
解析
perl表示用perl程序来处理随后的脚本
-p选项自动生成小程序
即
while(<>){
print;
}
-i.bak其作用是在程序运行前把$^I设为".bak"
-w开启警告功能
-e来告诉perl后面跟着的是可供执行的程序代码
这段代码会放在之前生成的while循环中print的前面
这一句操作可以等价以下程序
#!/usr/bin/perl -w
$^I=".bak".
while(<>){
s/Randall/Randal/g;
print;
}