Perl處理數據(二):tr和y///

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
相關文章
相關標籤/搜索