close

這章講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 是針對一個一個字。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 lettice0913 的頭像
    lettice0913

    斑的家

    lettice0913 發表在 痞客邦 留言(0) 人氣()