re = regular expression
我覺得perl 的其中一個特色就是寫re。
有關的function
index
rindex
substr
tr
$_ =~ /xxx/
index 的就是可以判斷字串中的子字串的起點在什麼位置。
功用:我們可以用來找一個子字串是否存在於字串。
若不存在,則會回傳-1
index $line, 'pp'; # 判斷$line 裡是否有pp 子字串。
rindex 跟index 差不多,但起點是尾端。
substr 一聽就是拿子字串罷了。
但是它還可以用來做substitution。
像是:s/xxx/XX/ # 將xxx 換成XX
$_ = ABCDEFGH;
substr($_,5,3) = "AAA";
變成ABCDEAAA
不過前提是你要知道子字串的位置。
tr 則是將一個個字元做需要的更換
做一對一的更換
例如:tr/A/GG/ 這樣不對。
最多只能tr/A/G/ (A 換成G)
在做regular expression 的運算。
有一些特別的變數需要記得。
情況1:我想要知道目前match 的東西是什麼,還有matched 前的子串及matched 後的字串。
交給$` 、$& $' 吧。
例如:
if(/www.hihi.com.tw/)
{
print "before = $` \n";
print "now = $& \n";
print "after = $' \n";
}
雖然好像很不錯,但是每一次做regular expression 運算,變數裡的值都要再重
新被紀錄。所以會花額外的時間。
那如果不啟動紀錄的功能,要怎麼做?
我目前從書上得知是,都不要用到$` , $& , $' 就好了。
(雖然有點奇怪,不用就好了),勉強先接受好了。
情況2:再來是如果你想知道你目前match 的expression 其中一些值是啥。
可以使用( ) 包起來,再用$1 , $2 去做index
例如:
$a = "my house";
if($a =~ /(\w+) (\w+)/)
{
print $1, $2;
}
$1 是my , $2 是house
情況3 :如果我只是想用( ) 包起來而已,卻不想被紀錄存在$1 , $2 裡,那要怎麼做?
打上?: 在括號裡。
例如:(?:\w+) 就ok 囉。
留言列表