1. 程式人生 > >Perl處理數據(二):tr和y///

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

無法 副本 arc 換行 全部 arch 編譯 修飾符 同時

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///