tr的cds 的确用的少,但是有时候有妙用:
表 5-3。tr/// 修饰词
修饰词 含义
/c 与SEARCHLIST 为补
/d 删除找到的但是没有替换的字符
/s 消除重复的字符。
如果声明了 /c 修饰词,那么 SEARCHLIST 里的字符会被求补;也就是说,实际的搜索
列表包含所有不在 SEARCHLIST 里的字符。如果是 Unicode,这样可能会代表许多字符,
不过因为它们是逻辑存储的,而不是物理存储,所以你不用害怕会用光内存。
/d 修饰词把 tr/// 转换成所谓的“过滤吸收”操作符:任何由 SEARCHLIST 声明的但是
没有在 RELPACEMENTLIST 里给出替换的字符将被删除。(这样比一些 tr(1) 程序的性
质显得更加灵活,那些程序删除它们在 SERACHLIST 里找到的任何东西。)
如果声明了 /s 修饰词,被转换成相同字符的顺序字符将被压缩成单个字符。
如果使用了 /d 修饰词,那么 RELPACEMENTLIST 总是严格地解释成声明的样子。否则,
如果 REPLACEMENTLIST 比 SEARCHLIST 短,则复制 REPLACEMENTLIST 的最后
一个字符,直到足够长为止。如果 RELPACEMENTLIST 为空,则复制 SEARCHLIST,
这一点虽然奇怪,但很有用,尤其是当你只是想计算字符数,而不是改变它们的时候。也有
利于用 /s 压缩字符。
tr/aeiou/!/; # 把所有元音字母转换成!
tr{/\\\r\n\b\f. }{_}; # 把怪字符转成下划线
tr/A-Z/a-z/ for @ARGV; # 把字符规则化为小写ASCII
$count = ($para =~ tr/\n//); # 计算$para 里的换行符
$count = tr/0-9//; # 计算$_里的位
$word =~ tr/a-zA-Z//s; # bookkeeper -> bokeper
tr/@$%*//d; # 删除这里几个字符
tr#A-Za-z0-9+/##cd; # 删除非base64 字符
# 顺便修改
($HOST = $host) =~ tr/a-z/A-Z/;
$pathname =~ tr/a-zA-Z/_/cs; # 把非ASCII 字母换成下划线
tr [\200-\377]
{\000-\177]; # 剥除第八位,字节操作
如果在 SEARCHLIST 里同一个字符出现的次数多于一次,那么只有第一个有效。因此:
tr/AAA/XYZ/
将只会把($_ 里的)任何单个字符 A 转换成 X。
尽管变量不会代换进入 tr///,但是你还是可以用 eval EXPR 实现同样效果:
$count = eval "tr/$oldlist/$newlist/";
die if $@; # 传播非法eval 内容的例外
最后一条信息:如果你想把你的文本转换为大写或者小写,不要用 tr///。用双引号里的 \U
或者 \L 序列(或者等效的 uc 和 lc 函数),因为它们会关心区域设置或 Unicode 信息,
而 tr/a-z/A-Z/ 不关心这些。另外在 Unicode 字串里,\u 序列和它的对应 ucfirst 函
数能够识别标题格式,对某些语言来说,比简单地转换成大写更突出。
2009/12/18 WENFENG LIU <wenfeng@live.nl>
thanks
Date: Fri, 18 Dec 2009 12:30:40 +0800From: galaxy2004@gmail.com
Subject: Re: [PerlChina] 正则表达式中 y/*//d 代表什么?
To: perlchina@googlegroups.com
tr///cds
c: 补齐不匹配的
d: 删除不匹配的
s: squeeze : 压缩重复的
=~ tr///cds 因为也用了 =~ , 所以有时候归为正则表达式 的运算介绍,
但实际上不是 regex2009/12/18 Qiang (James) <shijialee@gmail.com>
WENFENG LIU wrote:
> 也就是说y和tr功能一样,只是相对于tr,y能够解释元字符。
> 那么d代表什么呢?
Perl 自带的文档里有详细的说明。
在命令行里运行 perldoc -f tr 和 perldoc perlop, 或者网页版的
http://perldoc.perl.org/functions/tr.html
Qiang
>
> ------------------------------------------------------------------------
> Date: Fri, 18 Dec 2009 11:44:48 +0800> <mailto:tigerpeng2001@gmail.com>>
> Subject: Re: [PerlChina] 正则表达式中 y/*//d 代表什么?
> From: joewu@cyagen.com
> To: perlchina@googlegroups.com
>
>
>
> 2009/12/18 Tiger Peng <tigerpeng2001@gmail.com
>
> y/// = tr///
>
> 2009/12/17 WENFENG LIU <wenfeng@live.nl <mailto:wenfeng@live.nl>>:
> > 求助
> > 里面y代表什么, d代表什么?
> >
> tr函数能以一一对应的方式将搜索字符串中的字符替换成字符串中的相应字
> 符。tr函数不能解释正则表达式中的元字符 这里可以用y来替换
--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
--
Yours Sincerely
Zeng Hong
--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
Keep your friends updated— even when you’re not signed in.--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
--
Yours Sincerely
Zeng Hong
--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
没有评论:
发表评论