tr和y///
是等價的。用來實現一一映射,但也有額外的功能,就像Linux下的tr命令同樣。code
用法:編譯
tr/SEARCH/REPLACEMENT/cdsr y/SEARCH/REPLACEMENT/cdsr 其中: c:取search的補集,將search中未找到的字符全都替換成replacement的最後一個字符 d:刪除search中出現的字符 s:壓縮重複字符,僅僅只須要壓縮不須要替換時,可將replacement指定爲空 r:返回的不是替換成功的數量,而是替換成功後的內容,和s///的r修飾符是同樣的
例如:變量
1.映射功能perl
將小寫字母e替換爲大寫字母E。qq
$str="abcdef"; $str =~ y/e/E/; print "$str\n";
將小寫字母全替換爲大寫字母。數據
$str="abcdef"; $str =~ y/[a-z]/[A-Z]/; print "$str\n";
若是對同一個字母指定不一樣的映射集,那麼第一個映射將生效。copy
$str="aaa ddd eee fff"; $str =~ tr/aaa/xyz/; print "$str\n"; # 輸出xxx ddd eee fff
2.使用r返回替換後的結果co
該修飾符使得處理數據前會先拷貝一份數據,而後對副本數據進行操做,因此原始數據會保持不變。字符
$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不會被保留,獲得"abc " $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