接上一篇 ,继续介绍关于Perl中正则表达式稍微高级点的话题。
列表上下文中的m//
在列表context中使用模式匹配(m//)时,如果匹配成功返回值为内存变量值的列表;如果失败则为空列表,例如:
在s///中介绍的/g、/i等修饰符也可用在m//中,它允许你在字符串中的多处进行匹配,例如:
我们还可以将返回的字符串放入hash中,例如:
非贪婪的数量词
已经出现过的四个数量词(*、+、?和{ })都是贪婪的。它们将最大限度的匹配,而非在匹配成功时即立刻返回。使用贪婪的数量词的问题主要在于:可能会使正则表达式引擎做大量的不必要的回退(backtracking)操作。因此,需要一种非贪婪的方法。
贪婪 非贪婪
* *?
+ +?
? ??
{,} {,}
匹配多行文本
通常,正则表达式是针对单行文本的。锚定^和$是指整个字符串的开头和结束,但/m这个正则表达式选项允许它们根据内部的换行符进行匹配。这时锚定针对每一行,而非整个字符串。如下面的例子中,我们将整个文件读入一个变量中,然后将文件名字加在没一行的开头处:
更新大量文件
特殊变量$^I:备份文件的扩展名。
在命令行中进行修改
perl -p -i.bak -w -e 's/old/new/g' *.dat
Perl有完整的命令行选项,通过它们只需在命令行中输入几个字符,就能构建一个完整的程序。
-p:要求Perl为你写一个程序,虽然算不上完整,看起来像下面:
-i.bak:在程序中将$^I的值设置为“.bak”,如果不需要备份,可以使用-i参数,后不接任何扩展名。
-w:将警告打开。
-e:执行下面的代码,即这里的s/old/new/g字符串被当作Perl代码执行。由于我们有while循环(-p选项),这段代码被放在循环内,print之前。
*.data:指定此模式作用的文件名。
上面几部分综合起来,类似下面的程序:
Perl的命令行选项也是很好很强大的哦!
非捕捉用的括号
在正则表达式中,括号通常起分组和捕捉匹配上的字符串的作用。
如果只想用括号将某部分进行分组,不希望获取匹配的字符串,我们可以在开括号的后面加上一个问号和冒号,即?:。其作用是告诉Perl,括号只是分组的作用,如/(?:an)?/s*(apple|banana|orange)/。
有关Perl正则表达式的基础知识就介绍这么多,这一系列也将在此告一段落。