Perl初级教程 - 第三天


 

 

 

 

第三页:替换和翻译

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/; >>

Perl初级教程
第一页 条件语句
第二页 字符串匹配
第三页 替换和翻译

[第1天][第2天][第3天][第4天]

 



本文根据 网猴 相关文章改编,版权归原作者所有。