圆括号
圆括号有两种用法
- 将“或”操作(“|“符号)的两个值括起来,比如(ABC|abc)
- 将多个字符括起来做为一个整体,使之可以用?、+、* 或{m,n}来限定该整体的匹配次数
反向引用
当被圆括号括住的整体被匹配时,该匹配能够被正则表达式工具记住,并由/1、/2、/3……来引用第一个、第二个、第三个……匹配。例如,本书开篇所讲的那个找出重复单词的例子,可以由如下正则表达式来匹配:
/b([A-Za-z]+)/s+/1/b
其中/b匹配单词边界,/s匹配空格、制表符、换行符等“空白分界”,/1是反向引用,引用的是圆括号括起来的整体匹配。(要点,要使用反向引用,必须要用圆括号将匹配括起来,否则正则表达式无法记住那个匹配)
这本书的第2章,开始简单地介绍了一下Perl,首先是把开篇那个“查找重复单词”问题的解决方案列了出来,一段简短的Perl代码:
00001: $/ = "./n";
00002: while (<>) {
00003: next if !s//b([a-z]+)((?:/s|<[^>]+>)+)(/1/b)//e[7m$1/e[m$2/e[7m$3/e[m/ig;
00004: s/^(?:[^/e]*/n)+//mg;
00005: s/^/$ARGV: /mg;
00006: print;
00007: }
Perl的一些基础语法是:
- 变量由$开头,如$celsius(见下面朋友的指正)
- 变量的类型可以是数值型或字符型
- 注释由#开头(可以是单行注释,也可以是行尾注释)
- 字串常量用双引号括起来,与其它语言(如C)不同的是,用双引号内出现的变量名(由$开头),会被变量的值替换
- 用print输出
- Perl命令行的可选参数-w,让Perl使用更高级别的语法检查,并打印警告信息(比如变量未被始化就使用、声明了变量却未使用等)
- if ($foo =~ m/^/d+$/) 这样的语法是在测试“$foo这个变量的值匹配^/d+$这个正则表达式”的布尔结果。=~这个操作符既不是等于(==),也不是赋值(=),而是“是否匹配”
- 正则表达式用两个斜杠/字符括起来,前面的m表示匹配操作(可选),如果把m换成s,则表示“替换”
本书第2章简单地介绍了一下Perl,完全任自己的猜想臆断,总结了上面几条,下面是好友Buchi Automata的指正:
严 格说,是scalar variable(标量变量?)由$开头。如果是矢量变量,则由@开头。比如@arr = [1, 2, 3, 4]。如果是hash,则用%开头。比如%h = {1=>'a', 2=>'b'}。RE前面的m有它的作用。有了m,我们可以用任何配对的符号表示RE。比如/pattern/ 和 m{pattern} 和m&pattern&都一个意思。