Perl處理數據(二):tr和y///
tr和y///
是等價的。用來實現一一映射,但也有額外的功能,就像Linux下的tr命令一樣。
用法:
tr/SEARCH/REPLACEMENT/cdsr
y/SEARCH/REPLACEMENT/cdsr
其中:
c:取search的補集,將search中未找到的字符全都替換成replacement的最後一個字符
d:刪除search中出現的字符
s:壓縮重復字符,僅僅只需要壓縮不需要替換時,可將replacement指定為空
r:返回的不是替換成功的數量,而是替換成功後的內容,和s///的r修飾符是一樣的
例如:
1.映射功能
將小寫字母e替換為大寫字母E。
$str="abcdef"; $str =~ y/e/E/; print "$str\n";
將小寫字母全替換為大寫字母。
$str="abcdef";
$str =~ y/[a-z]/[A-Z]/;
print "$str\n";
如果對同一個字母指定不同的映射集,那麽第一個映射將生效。
$str="aaa ddd eee fff";
$str =~ tr/aaa/xyz/;
print "$str\n"; # 輸出xxx ddd eee fff
2.使用r返回替換後的結果
該修飾符使得處理數據前會先拷貝一份數據,然後對副本數據進行操作,所以原始數據會保持不變。
$str="abcdef"; print $str =~ y/e/E/r; print $str,"\n";
所以,可以將r修飾符的操作結果賦值給其它變量。
$str="abcde";
$copy = $str =~ y/e/E/r;
print $copy,"\n";
print $str,"\n";
3.用s修飾符壓縮字符
$str="abc ddd eee ffff";
print $str =~ tr/ //sr;
可以壓縮換行符:
$str1="abc\n\nddd\neee fff";
print $str1 =~ tr/\n //sr;
4.d修飾符刪除search中有,但replacement中沒有的字符
也就是保留replacement的字符,其余刪掉。
例如,直接刪除某些字符,不指定replacement,那麽search中的字符都被刪除。
$str="abc ddd eee fff";
$str =~ y/de//d;
print qq("$str"); # 輸出:"abc fff"
$str="abc ddd eee fff";
$str =~ y/de/e/d; # e被保留
print qq("$str");
關於d修飾符,有些復雜。如果search部分指定的不是精確的字符,那麽被編譯時就不知道是哪些字符需要查找,也就無法從replacement中找到哪些字符需要保留,從而replacement部分變得多余。
$str="abc ddd eee fff";
$str =~ y/[d-f]/e/d; # e不會被保留
$str =~ y/[def]/e/d; # e不會被保留
$str =~ y/[df]e/e/d; # e不會被保留
5.c修飾符取補集,將search中未指定的字符全部替換為replacement中的最後一個字符
$str="aaa bbb ccc ddd";
print $str =~ y/ab/xy/cr; # aaaybbbyyyyyyyy
註意上面,除了a和b外,全都替換成了y字符,x字符被忽略。
如果replacement比search長,則仍然是取replacement的最後一個字符作為替換字符。所以下面的等價:
y/ab/xy/c;
y/ab/zxy/c
所以,指定一個補集的替換字符即可。
如果同時指定了s修飾符,則補集替換後,再壓縮。
$str="aaa bbb ccc ddd";
print $str =~ y/ab/xy/scr; # aaaybbby
如果指定了d修飾符,則刪除所有未在searchlist中的字符,也就是說replacement部分成了多余的:
$str="aaa bbb ccc ddd";
print $str =~ y/ab/xy/dcr; # aaabbb
6.c和d修飾符一起用時,一個取search的補集保留search,一個刪除search,如何處理?
perl的y///
是保留search,但不作補集替換,也就是cd修飾符各生效一部分。也因此,replacement部分是多余的。
$str="abc ddd eee fff";
$str =~ y/df/x/cd;
print qq("$str"); # 返回:dddfff
Perl處理數據(二):tr和y///