在Perl中使用正则表达式时,tr///和s///有什么区别?

28

我想知道在使用Perl中的正则表达式时,何时应该使用s///而不是tr///

3个回答

34

s///用于替换:

$string =~ s/abc/123/;

这将会用 "123" 替换在 $string 中第一个出现的 "abc"。

tr/// 用于替换字符:

$string =~ tr/abc/123/;

这将把 $string 中所有的 "a" 替换为 "1",所有的 "b" 替换为 "2",所有的 "c" 替换为 "3"。


6
别忘了我们最喜欢的高尔夫推杆,y/// - Daenyth
1
@Herdsman 两者之间没有区别。这是一个音译运算符,所以 tr/// 是他们称呼它的方式,但是因为在 sed 中 y/// 也可以实现同样的功能,所以他们也将 y/// 引入了 Perl。 - CanSpice
主要区别在于它会迭代并更改任何单个匹配项,例如 tr/uk/gb/ 将更改任何 us 出现为 gs 和任何 ak 出现为 ab. - Cheruvim

19

tr///不是一个正则表达式操作符,它适用于将一个单一字符替换为另一个单一字符的情况(且比s///更快),或者使用d修饰符将单个字符替换为零个字符。

对于除了tr的狭窄用例之外的任何更复杂的情况,应该使用s///


8

来自perlop:引用和类似引用的运算符

请注意,tr不支持正则表达式字符类,例如\d或[:lower:]。tr运算符不等同于tr(1)实用程序。如果您想在大小写之间映射字符串,请参见lc和uc,并且一般情况下,如果需要正则表达式,则考虑使用s运算符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接