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初级教程
|
|