如果把m//模式匹配操作符想成文字处理器的查找功能,那么“查找与替换”的功能就是perl的s///替换操作符。
$_ = "He's out bowling with barney tonight.";
s/Barney/Fred/; #用Fred替换Barney
print "$_ ";如果匹配失败,则什么事都不会发生,变量也不受影响。
s///会返回有用的布尔值。它在替换成功时为“真”,否则为“假”
2,以/g进行全局替换
一个场景的全局替换是缩减空白,也就是将任何连续的空白转换为单一空格
$_ = "Input data may have extra whitespace.";
s/s+/ /g;
3,不同的定界符
对于一般没有左右之分的字符,用法便跟使用斜线一样,只用3个定界符即可
s#^https://#http://#;
如果有左右之分的成对字符,就必须使用两对,一对包住模式,一对包住替换自发串,包住字符串和模式的定界符号簿需要相同
s{fred}{barney};
s[fred}(barney);
s#barney#;
4,选项修饰符
不仅是/g修饰符,替换运行也可以使用我们在一般模式中看到的/i与/s修饰符。修饰符的顺序对结果没有任何影响。
5,绑定操作符
就像在说明m//时提到的,我们也可以用绑定操作符为s///选择不同的目标
6,大小写转换
U转义字符会将其后的所有字符转换成大写
$_ = "I saw Barney with Fred.";
s/(fred|barney)/U$1/gi; #$_ 现在是"I saw BARNEY with FRED."
L转义字符会将其后的字符转换成小写
s/(fred|barney)/L$1/gi; #$_ 现在是"I saw barney with fred."
可以使用E关闭大小写转换功能
s/(w+) with (w+)/U$2E with $1/i; #$_ 现在是“I saw FRED with barney."
使用小写形式(l与u)时,它们只会影响之后的第一个字符
s/(fred|barney)/u$1/ig; #$_ 现在是" I saw FRED with Barney."
使用u与L来表示"全部转换为小写,但首字母大写"
s/(fred|barney)/uL$1/ig; #$_ 现在是“I saw Fred with Barney."
这里介绍的是替换大小写的转换,但他们也适用于任何双引号内的字符串
print "Hello, Lu$nameE, would you like to play a game? ";
7, split操作符
它会根据分割符(separator)拆开一个字符串。这对处理制表符,冒号,空白或任意符号分割的数据相当有用
@fields = split /separator/, $string;
例如:
@fields = split /:/, "abc:def:g:h"; #产生("abc","def","g","h")
利用/s+/模式以空白进行分割也是常见的做法,在此模式下,所有的空白会被当成一个空格来处理
my $some_input = "This is a test. ";
my @args = split /s+/, $some_input; #("This","is","a","test.")
split默认会以空白字符拆开$_:
my @fields = split; #等于 split /s+/, $_;
8, join函数
split会将自费串分解为整个片断(子字符串),而join则会把这些片断联合成一个字符串。它的用法如下所示:
my $result = join $glue, @pieces;
例如:
my $x = join ":" 4,6,8,10,12; # $x 为 "4:6:8:10:12"
9, 列表上下文中的m//
$_ = "Hello there, neighbor!";
my($firse,$second,$third) = /(s+) (s+), (s+)/;
print "$sencond is my $third ";
之前在s///的例子中所看到的/g修饰符,同样也可以用在m//操作符上,其效果就是让模式能够匹配到字符串中的许多地方。下面的例子中
具有一对圆括号的模式,会在每次匹配成功是返回一个记忆:
my $text = "Fred droped a 5 ton granite block on Mr. Slate";
my @words = ($text =~ /([a-z]+)/ig);
print "Result:@words ";
# Result: Fred dropped a ton granite block on Mr Slate
如果里面不仅仅是一对圆括号,那么每次匹配成功,就可能返回一个以上的字符串,假设,我们想把一个字符串变成散列,就可以这样做:
my $date = "Barney Rubble Fred Flintstone Wilma Flintstone";
my %last_name = ($sdata =~ /(w+)S+(w+)/g);
10, 非贪心量词
/fred.+?barney/
11, 跨行的模式匹配
传统的正则表达式都是用来匹配单行文本。由于perl可以处理任意长度的字符串。其模式匹配也可以处理多行稳步,与处理单行稳步并无
差异。
$_ = "I'm much better than Barney is at bowling, Wilma. ";
^与$这两个锚点原本代表整个字符串的头跟尾。当模式加上/m修饰符后,就可以让他们也代表换行符号。这样一来,他们所代表的就不在
是整个字符串的头尾,而是每行的开头跟结尾。
print "Fonud 'wilma' at start of line " if /^wilma /im;
11,一次更新多个文件
#!/usr/bin/perl -w
use strict;
chomp(my $sdate = `date`);
$^I = ".bak";
while (<>) {
s/^Author:.*/Author: Randal L. Schwartz/;
s/^Phone:.* //;
s/^Date:.*/Date:$date/;
print;
}
# $^I 先把文件做一个备份
12,不具记忆功能的圆括号
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/312079/viewspace-245694/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/312079/viewspace-245694/