perl 正则s///与tr///
$str = "What a wonderful wonderful world."; $str =~ s/w/'$&'/g; # $str = "What a 'w'onderful 'w'onderful 'w'orld."
假設我想把找到的結果全轉成大寫,一般的置換就傷透腦筋了,可是perl提供了不錯的解法,但是要使用函數,就得加上 e 修飾子:
$str = "What a wonderful wonderful world."; $str =~ s/w\w+/uc($&)/ge; # $str = "What a WONDERFUL WONDERFUL WORLD"
如果沒加 e 修飾子,則函式會被當成字串丟出來: What a uc(wonderful) uc(wonderful) uc(world)
再來比較麻煩的是字串中的換行 \n,字串中的換行字元 '\n' 被當成是一個字元來處理,所以假設一個具有換行字元的(多行的的字串,希望比對時忽略那個換行字元,就要加上 s 修飾子:
$str = "What a wonder\nful wonderful world."; $str =~ s/wonder.?ful/www/g; print $str;
What a wonder ful
www world
接下來加上 s 修飾子後,\n就等於是"一個字元",也等於'\n';否則未加s的情況則不屬於一個字元,也就是和 '.' 比對不會成功: $str =~ s/wonder.?ful/www/sg;
如果我們堅持一定要和換行比對成功,則:注意沒加 s $str =~ s/wonder\nful/www/g;
line123
$str = "Aine123\nBine789"; $str =~ tr/a-zA-Z/A-Za-z/; print $str;
aINE123 bINE789
$doc="<78>Nov 3 11:20:01 163.17.44.1 crond[30367]: (root) CMD (LANG=C LC_ALL=C /usr/bin/mrtg /etc/mrtg/mrtg.cfg --lock-file /var/lock/mrtg/mrtg_l --confcache-file /var/lib/mrtg/mrtg.ok)"; print $doc=~ tr/0-9/0-9/;
結果:22
my $text = 'good cheese'; $text =~ tr/eo/eu/s; print "$text\n";
# 結果 gud chese ,
my $big = 'vowels are useful'; $big =~ tr/aeiou/AEI/d;
# 注意看對照表左邊只有三個字母,所以如果遇到 ou,就會被刪掉 print "$big\n";
# 結果 vwEls ArE sEfl 合併以上兩個參數
my $text = 'good cheese'; $text =~ tr/eogd/eu/ds;
# 寫成 ds 或sd 都可以,順序不重要 print "$text\n";
# 結果 u chese
最後來看 c 這個選項,c 較複雜不易懂,大致以我的大腦所知的說明如下: tr/左清單/右清單/c 規則、左清單沒有的,就補右清單的東西。
my $text = 'good cheese'; $text =~ tr/eo/_/c;
#注意看對照表右邊只有二個字母,只要右邊清單沒列到的就補'_',包括空白 print "$text\n";
# 結果 _oo____ee_e
如果右清單寫了不只一個呢?會怎樣?其實補的時候還是只會拿右清單的最後一個
$doc="<78>Nov 3 11:20:01 163.17.44.1 crond[30367]"; $doc =~ y/a-zA-Z/a-z/c;
# 結果不是英文全都補了右清單的最後一個字元'z'
$doc= zzzzzNovzzzzzzzzzzzzzzzzzzzzzzzzzcrondzzzzzzz