Perl处理数据(二):tr和y///
Perl处理数据(二):tr和y///
tr和y///
是等价的。用来实现一一映射,但也有额外的功能,就像Linux下的tr命令一样。
用法:
1 | tr/SEARCH/REPLACEMENT/cdsr |
例如:
1.映射功能
将小写字母e替换为大写字母E。
1 | $str="abcdef"; |
将小写字母全替换为大写字母。
1 | $str="abcdef"; |
如果对同一个字母指定不同的映射集,那么第一个映射将生效。
1 | $str="aaa ddd eee fff"; |
2.使用r返回替换后的结果
该修饰符使得处理数据前会先拷贝一份数据,然后对副本数据进行操作,所以原始数据会保持不变。
1 | $str="abcdef"; |
所以,可以将r修饰符的操作结果赋值给其它变量。
1 | $str="abcde"; |
3.用s修饰符压缩字符
1 | $str="abc ddd eee ffff"; |
可以压缩换行符:
1 | $str1="abc\n\nddd\neee fff"; |
4.d修饰符删除search中有,但replacement中没有的字符
也就是保留replacement的字符,其余删掉。
例如,直接删除某些字符,不指定replacement,那么search中的字符都被删除。
1 | $str="abc ddd eee fff"; |
1 | $str="abc ddd eee fff"; |
关于d修饰符,有些复杂。如果search部分指定的不是精确的字符,那么被编译时就不知道是哪些字符需要查找,也就无法从replacement中找到哪些字符需要保留,从而replacement部分变得多余。
1 | $str="abc ddd eee fff"; |
5.c修饰符取补集,将search中未指定的字符全部替换为replacement中的最后一个字符
1 | $str="aaa bbb ccc ddd"; |
注意上面,除了a和b外,全都替换成了y字符,x字符被忽略。
如果replacement比search长,则仍然是取replacement的最后一个字符作为替换字符。所以下面的等价:
1 | y/ab/xy/c; |
所以,指定一个补集的替换字符即可。
如果同时指定了s修饰符,则补集替换后,再压缩。
1 | $str="aaa bbb ccc ddd"; |
如果指定了d修饰符,则删除所有未在searchlist中的字符,也就是说replacement部分成了多余的:
1 | $str="aaa bbb ccc ddd"; |
6.c和d修饰符一起用时,一个取search的补集保留search,一个删除search,如何处理?
perl的y///
是保留search,但不作补集替换,也就是cd修饰符各生效一部分。也因此,replacement部分是多余的。
1 | $str="abc ddd eee fff"; |