选项 描述 g 匹配所有可能的模式 i 忽略大小写 m 将串视为多行 o 只赋值一次 s 将串视为单行 x 忽略模式中的空白
1、匹配所有可能的模式(g选项)
@matches = "balata" =~ /.a/g; # now @matches = ("ba", "la", "ta")
匹配的循环:
while ("balata" =~ /.a/g) {
$match = $&;
print ("$match/n");
}
结果为:
ba
la
ta
当使用了选项g时,可用函数pos来控制下次匹配的偏移:
$offset = pos($string);
pos($string) = $newoffset;
2、忽略大小写(i选项)例
/de/i 匹配de,dE,De和DE。
3、将字符串看作多行(m选项)
在此情况下,^符号匹配字符串的起始或新的一行的起始;$符号匹配任意行的末尾。
4、只编译模式一次
$var = 1;
$line = <STDIN>;
while ($var < 10) {
$result = $line =~ /$var/o;
$line = <STDIN>;
$var++;
}
每次均匹配/1/,尽管var在改变。
5、将字符串看作单行例
/a.*bc/s匹配字符串axxxxx /nxxxxbc,但/a.*bc/则不匹配该字符串。
6、在模式中忽略空格
//d{2} ([/W]) /d{2} /1 /d{2}/x等价于//d{2}([/W])/d{2}/1/d{2}/。
五、替换操作符
语法为s/pattern/replacement/,其效果为将字符串中与pattern匹配的部分换成replacement。如:
$string = "abc123def";
$string =~ s/123/456/; # now $string = "abc456def";
在替换部分可使用模式次序变量$n,如s/(/d+)/[$1]/,但在替换部分不支持模式的特殊字符,如{},*,+等,如s/abc/[def]/将把abc替换为[def]。
替换操作符的选项如下表:
选项 描述 g 改变模式中的所有匹配 i 忽略模式中的大小写 e 替换字符串作为表达式 m 将待匹配串视为多行 o 仅赋值一次 s 将待匹配串视为单行 x 忽略模式中的空白
注:e选项把替换部分的字符串看作表达式,在替换之前先计算其值,如:
$string = "0abc1";
$string =~ s/[a-zA-Z]+/$& x 2/e; # now $string = "0abcabc1"
六、翻译操作符
这是另一种替换方式,语法如:tr/string1/string2/。同样,string2为替换部分,但其效果是把string1中的第一个字符替换为string2中的第一个字符,把string1中的第二个字符替换为string2中的第二个字符,依此类推。如:
$string = "abcdefghicba";
$string =~ tr/abc/def/; # now string = "defdefghifed"
当string1比string2长时,其多余字符替换为string2的最后一个字符;当string1中同一个字符出现多次时,将使用第一个替换字符。
翻译操作符的选项如下:
选项 描述 c 翻译所有未指定字符 d 删除所有指定字符 s 把多个相同的输出字符缩成一个
如$string =~ tr//d/ /c;把所有非数字字符替换为空格。$string =~ tr//t //d;删除tab和空格; $string =~ tr/0-9/ /cs;把数字间的其它字符替换为一个空格。
七、扩展模式匹配
PERL支持PERL4和标准UNIX模式匹配操作所没有的一些模式匹配能力。其语法为:(?<c>pattern),其中c是一个字符,pattern是起作用的模式或子模式。
1、不存贮括号内的匹配内容
在PERL的模式中,括号内的子模式将存贮在内存中,此功能即取消存贮该括号内的匹配内容,如/(?:a|b|c)(d|e)f/1/中的/1表示已匹配的d或e,而不是a或b或c。
2、内嵌模式选项
通常模式选项置于其后,有四个选项:i、m、s、x可以内嵌使用,语法为:/(?option)pattern/,等价于/pattern/option。
3、肯定的和否定的预见匹配
肯定的预见匹配语法为/pattern(?=string)/,其意义为匹配后面为string的模式,相反的,(?!string)意义为匹配后面非string的模式,如:
$string = "25abc8";
$string =~ /abc(?=[0-9])/;
$matched = $&; # $&为已匹配的模式,此处为abc,而不是abc8
4、模式注释
PERL5中可以在模式中用?#来加注释,如:
if ($string =~ /(?i)[a-z]{2,3}(?# match two or three alphabetic characters)/ {
...
}
PS:一个新函数:grep
Perl中的一个常见操作是搜索数组,寻找某些模式。例如,如果将一个文件读入一个数组,
然后你想要知道哪一行包含某个单词。Perl有一个特殊的函数,可以用来进行这项操作,这个
函数称为grep。grep函数的句法如下:
grep expresstion, list grep block list grep函数迭代运行通过list中的每个元素,然后执行expression或block。在expression或block中,$ _被设置为要计算的列表中的每个元素。如果该表达式返回真, grep就返回该元素。
请看下面这个例子:my @dogs = qw(greyhound bloodhound terrier mutt chihuahua); my @hounds = grep /hound/, @dogs; 在这个例子中,@dogs的每个元素被依次赋予$ _。然后根据$ _对表达式/hound/进行测试。返回真的每个元素被grep返回,并存放在@hounds中。这里你必须记住两点。首先,在表达式中,$ _是对列表中的实际值的引用。如果修改$ _,就会改变列表中的原始元素:@hounds = grep s/hound/hounds/, @dogs;当运行这个代码后, @ hounds将包含greyhounds和bloodhounds(请注意它们结尾处的字母s )。通过修改$ _,原始数组@ dogs也被修改了,同时,它现在包含了greyhounds、bloodhounds、terrier、mutt和chihuahua。需要记住的另一点( Perl程序员有时忘记了这一点)是:grep不一定必须与模式匹配或替换运算符一道使用,它可以与任何运算符一道使用。下面这个例子用于检索长度超过8个字符的犬名:@longdogs=grep length($_)8, @dogs;
参考资料:1 网上一个未名的好心人写的模式匹配教学
2 Perl 语言编程 第三版 作者:Larry Wall, Tom Christiansen, and Jon Orwant 译者:何伟平