這章講pattern matching ,我想這大概是perl 最有用的地方了吧。
m dl pattern dl [modifiers]
dl:delimiter
例如
if(/snow/)
{
print "has snow \n";
}
如果delimiter 是/ 那前面可以省略m
if(m_snow_)
{
print "has snow \n";
}
跟上面if(/snow/) 是一樣的。
上面並沒指說用哪個變數來做matching,就是指$_
如果想要某個變數做matching 的話,要寫成
if($string =~ /snow/)
{
...
}
如果$string 中有snow 的話,那$string =~/snow/ 就會return true,
如果寫成
if($string !~ /snow/)
{
...
}
就是說如果$string 裡有snow ,就return false。
character class
這邊指有時我們希望某一個字是一個字集裡的字。
例如我們希望變數的第一個字是數字。
那就寫成
/^[0-9]\w/
^是強調要第一個字是[0-9] 其中一個,
而\w 是[a-zA-Z]的abbreviation。
那如果希望字不要是數字的話就打
[^0-9],注意這邊如果^寫在[ ] 裡面,是指反向的意思。
而如果寫在外面的話,又是放在最前面的位置就是指
希望第一個字要是什麼。放在其他地方就是要match ^。
另外常用的abbreviation 有
\d -> [0-9]
\D -> [^0-9]
\w -> [A-Za-z_]
\W -> [^A-Za-z_]
\s -> [ \r\t\n\f]
\S -> [^ \r\t\n\f]
我們也可以指定某個pattern 要出現幾次,
/a{1,3}b/ -> aaab
/a{2,}b/ -> 至少兩個a
/a{2}b/ ->兩個a
如果要出現一次以上的話可以用+
/a+/ 。
0次以上用*
/a*/
出現0次或1次用?
/a?/
萬用字元是.
如果希望一個字串出現多次,那麼就要先用( ) 包起來,例如
/(mom){3}/ ,就是mommommom
接下來,要說明match 大概是的方法。
$_ = "I am Allen I am Allen";
/.*Allen/ #這樣的話,是match 全部而不是I am Allen 而已
因為.* 可以想成是greedy ,matching 越多越好。
如果指希望match Iam Allen 的話,
就打
/.*?Allen/
ALTERNATION
/(cat)|(dog)/
這是match cat 或dog 。
如果希望pattern 是在最後面的情況要打
/hair$/,就是hair 要出現在最後面。
LOOKAHEAD & LOOKBEHIND
有時我們希望pattern 後面要是什麼的話,可以用
/\d+(?=\.)/
這是數字後面要有. 才算match 成功
?= 可以算是lookahead 的語法,當然也可以希望
後面不要是什麼就用?!
如果希望前面要是什麼就打
/(?<=\.)d+/
是希望數字前面要有. ,如果不希望有什麼就用?<!
\. 的意思的\是為了要消除. 的特殊意義。
在split function 裡,也可以用到pattern
例如@arr = split /d+/,"abc123af234gg56g";
arr[0] = "abc";
arr[1] = "af";
...
pattern 中我們可以有remember 的功能
/(abc) & \1 /
這邊是的\1 表示第一個( ) 裡的東西。當然也有\2 , \3 分別指第二個( ) 第三..
最後可以有取代的功能。
$_ = "sum of sum";
s/sum/S/g;
s 是substitution , g 是指全部。
沒有g的話,找到第一個符合就會停止了。
還有tr 在unix 中的功能。
tr/a-z/A-Z/
會把原本$_ = "abcd";
變成"ABCD";
這邊要注意的是,tr 是針對一個一個字。
留言列表