替换和翻译
Perl可以在匹配的基础上进行替换操作。可以用s函数实现这个功能。如果不使用匹配操作符,那么替换被认为对$_变量进行操作。
在字符串$sentence中用London替换london可以用下面的表达式:
$sentence =~ s/london/London/
用$_变量可以这样做:
s/london/London/
表达式的结果是替换发生的次数,所以或者是0或者是1。
选项
上面的例子只替代第一个匹配的字符串,用g参数可以进行全程替换:
s/london/London/g
返回的结果为0或被替换的次数。
如果我们想替换lOndon, lonDON, LoNDoN等,可以这样做:
s/[Ll][Oo][Nn][Dd][Oo][Nn]/London/g
但是可以有更简单的方式 - 使用i选项(忽略大小写):
s/london/London/gi
记忆方式
如果记住匹配方式,以后用起来可以更方便。任何发生在括号内的匹配被记在变量$1,...,$9中。这些用在相同RE中的字符串可以用\1,...,\9表示:
$_ = "Lord Whopper of Fibbing"; s/([A-Z])/:\1:/g; print "$_\n";
这段代码替换任何大写字母为被冒号包围的形式。结果是:L:ord :W:hopper of :F:ibbing。变量$1,...,$9是只读变量,不可以修改它们。
另一个例子,判断语句:
if (/(\b.+\b) \1/)
{
print "Found $1 repeated\n";
}
将判断任何重复的单词。每个\b代表一个单词边界,.+与任何非空字符串相匹配,因此\b.+\b匹配任何两个单词边界中的内容。然后被括号记住,存储在\1中,$1被程序的其余部分使用。
下面的表达式交换$_变量的第一个和最后一个字符:
s/^(.)(.*)(.)$/\3\2\1/
^和$匹配行的开始和结尾。\1存储第一个字符,\2存储除第一个和最后一个字符之外的部分,最后一个字符存储在\3中。然后\1和\3进行互换。
匹配之后,可以使用特殊的只读变量$~、$&和$'找到查询之前、之中和之后的内容。所以在
$_ = "Lord Whopper of Fibbing"; /pp/;
之后,下面的表达式都为真(eq表示字符串匹配判断)。
$` eq "Lord Wo"; $& eq "pp"; $' eq "er of Fibbing";
在替换表达式中可以使用变量,因此
$search = "the"; s/$search/xxx/g;
将把任何出现的the替换为xxx。如果想替换there,则不能使用s/$searchre/xxx/,因为程序会把它当作变量$searchre。可以用花括号实现there的替换:
$search = "the";
s/${search}re/xxx/;
翻译
tr函数实现字符对字符的翻译。下面的表达式替换变量$sentence中的每个a为e,b为d,c为f。表达式返回替换的次数。
$sentence =~ tr/abc/edf/
大多数特殊RE代码不能用在tr函数中。例如,下面的语句计算$sentence变量中的星号数,然后存储在变量$count中。
$count = ($sentence =~ tr/*/*/);
但是"-"仍然表示"between"。下面的语句把变量$_转换为大写形式:
tr/a-z/A-Z/;