學習perl(5)

湖湘文化發表於2013-11-19
 

學習Perl (5)

今天下午幹別的事情去了

以正規表示式進行匹配
1
)以m//進行匹配
/i來進行不區分大小寫的模式匹配:
#!/usr/bin/perl -w

print "Would you like to play a game?";

chomp($_ = );

if (/yes/i) {

print "In that case,I recommend that you go bowling.n";

}
/s來匹配任意字元:
#!/usr/bin/perl -w

$_ = "I saw Barneyndown at the bowling alleynwith frednlast night.n";

if (/Barney.*Fred/s) {

print "That string mentions Fred after Barney!n";

}

/x來加上空白:
/ -? d+ .? d* /x
組合選項修飾符:
#!/usr/bin/perl -w

while (<>) {

if (/barney.*fred/si) {

print "That string mentions Fred after Barney!n";

}

}

2)錨點
插入標記(^)是一個錨點,用來標示字串的開頭,而美元符號($)則用來標示字串的結尾,如:/^fred/ /rock$//^s*$/,這代表一個空白行。
單詞錨點:b是單詞邊界錨點,它所匹配的是一個單詞頭尾兩端,如:/bfredb/。此處所謂的單詞是指一連串的字母、數字和下劃線的組合,也就是匹配/w+/模式的字串。
B
是非單詞邊界符,它會匹配任何不匹配b的位置,如:/bserchB/
繫結運算子=~
用來告訴Perl拿右邊的模式來匹配左邊的字串:
#!/usr/bin/perl -w

print "Do you like Perl?(yes/no)";

my $likes_perl = ( =~ /byesb/i);

if ($likes_perl) {

print "You said earlier that you like Perl,so ...n";

}

模式內的內插:正規表示式裡可以進行雙引號形式的內插,類似grep的程式:
#!/usr/bin/perl -w

my $what = "larry";

while (<>) {

if (/^($what)/) {

print "We saw $what in beginning of:$_";

}

}

3)匹配變數
匹配變數所儲存的都是字串,所以它們都是標量變數。在Perl裡,它們的命名方式像$1$2。模式裡的括號有多少對,匹配變數就有多少個。
#!/usr/bin/perl -w

$_ = "Hello there,neighbor";

if (/s(w+),/) {

print "the word was $1n";

}

#!/usr/bin/perl -w

$_ = "Hello there, neighbor";

if (/(S+) (S+), (S+)/) {

print "words were $1 $2 $3n";

}

自動匹配變數:$&$`$’,字串裡實際匹配模式的部分會被自動存進$&裡。
#!/usr/bin/perl -w

if ("Hello there, neighbor" =~ /s(w+),/) {

print "That actually matched '$&'.n"; # That actually matched ' there,'.

print "That was ($`)($&)($').n"; # That was (Hello)( there,)( neighbor).

}
第一份記憶儲存在$1,但$&裡匹配到的是整個段落。相符段落的前置字串會存到$`裡,而後置字串則存在$’裡。
匹配變數(包括自動匹配變數和有編號的匹配變數)最常用在替換運算中。
通用量詞:
模式/a{5,15}/可匹配重複出現515次的字母a;如果省略第二個數字(但包含逗號),則表示沒有上限,如:/(fred){3,}/;還可以是固定次數,如:/w{8}/
量詞*+?是簡寫:星號和量詞{0}相同,加號相當於{1},問號也可以寫成{0,1}

4)優先順序
最高等級是括號(),用於劃分組以及儲存;第二個等級是量詞,也就是反覆運算子(包括星號、加號、問號和花括號量詞);第三級是錨點與序列(包括^$bB);最低以及是分隔用的豎線(|)。
優先順序的範例:/^fred|barney$//^(fred|barney)$//^(w+)s+(w+)$/

5)模式測試程式
下面是一個有用的程式,可以用來檢測某些字串是否匹配所指定的模式:
#!/usr/bin/perl -w

while (<>) {

chomp;

if (/YOUR_PATTERN_GOES_HERE/) {

print "Matched:|$`$'|n";

} else {

print "No matched : |$_|n";

}

}
假設你所使用的模式是/match/,所輸入的字串是beforematchafter,結果為Matched:|beforeafter|

習題:
1
#!/usr/bin/perl -w

while (<>) {

chomp;

if (/match/) {

print "Matched:|$`$'|n";

} else {

print "No matched : |$_|n";

}

}
2
#!/usr/bin/perl -w

while (<>) {

chomp;

if (/(w+)a$/) {

print "Matched:|$`$'|n";

} else {

print "No matched : |$_|n";

}

}
參考答案如下:
#!/usr/bin/perl -w

while (<>) {

chomp;

if (/ab/) {

print "Matched:|$`$'|n";

} else {

print "No matched : |$_|n";

}

}
3
#!/usr/bin/perl -w

while (<>) {

chomp;

if (/(w+)a$/) {

print "The result: '$_'n";

}

}
參考答案如下:
#!/usr/bin/perl -w

while () {

chomp;

if (/(bw*ab)/) {

print "Matched:|$`$'|n";

print "$1 contains '$1'n";

} else {

print "No matched : |$_|n";

}

}

5 #!/usr/bin/perl -w

while (<>) {

chomp;

if (/(s+)$/) {

print "'$`'n";

}

}
參考答案如下:
#!/usr/bin/perl -w

while (<>) {

chomp;

if (/s+$/) {

print "$_#n";

}

}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21256317/viewspace-776993/,如需轉載,請註明出處,否則將追究法律責任。

相關文章