8.3 比對
比對的語法如下,若比對成功則傳回真,不成功則傳回假。
m/樣式/
可簡寫成 /樣式/
其中 / 可換成其它符號,但此時不能將 m 字元簡掉,如:
m!樣式!
m#樣式#
可加上修飾子:i m o s x g
用法:/樣式/修飾子
i 不計大小寫
m 視字串為多列
o 只編譯一次,以加快迴圈處理速度
s 當含有換列符號時,仍視為一列
x 允許含有註解,並忽略空白
g 全域比對
=~ 表示比對符合
!~ 表示比對不符合
$& 代表最後一次成功比對的字串
$` 代表比對到的字串之前半段所有字串
$' 代表比對到的字串之後半段所有字串
|
用例 1:
if ($my_best_like =~ /Perl/) {
print "Bingo!!!\n";
} else {
print '$%#@#$&*%$#@!', "\n";
}
|
若不想區分大小寫,可加上修飾子 i:
if ($my_best_like =~ /Perl/i) {
print "Bingo!!!\n";
} else {
print '$%#@#$&*%$#@!', "\n";
}
|
若想全面比對每一個地方,可加上修飾子 g:
$_ = "I want to go to San Francico. I want to!";
@word=/want/g; # 傳回比對到的字串
print "@word\n";
輸出:
want want
|
註:$_ 為 m/ / 預設作用對象。
用例 2:
chomp($IP=<STDIN>);
if ($IP =~ /\d+\.\d+\.\d+\.\d+/) {
print "$IP 可能是合法的 IP 位址!\n";
} |
用例 3:將比對成功的樣式記憶起來!!! (重要功能)
chomp($IP=<STDIN>);
if ($IP =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) {
print "第一個 ip : $1\n";
print "第二個 ip : $2\n";
print "第三個 ip : $3\n";
print "第四個 ip : $4\n";
} |
用例 4:樣式中可以進行變數代換
$msg_start='^From\s.*?@?.*?\s+?\w+\s\w+\s\d+\s\d+:\d+:\d+\s\d+';
if ($line =~ /$msg_start/) {
print "一封信件的開始!\n";
}
|
用例 5:樣式不符合,使用 !~ 符號
$msg_start='^From\s.*?@?.*?\s+?\w+\s\w+\s\d+\s\d+:\d+:\d+\s\d+';
# $line 若不符合 $msg_start 這個樣式
if ($line !~ /$msg_start/) {
print "不是一封信件的開始!\n";
}
|
用例 6:和檔案配合
while(<DATA>) {
print if /Kill/i;
}
__DATA__
Kill you, kill me.
Someone kill
yes do it
Just make.
Marry killed by money.
|
用例 7: | 的運用
while(<DATA>) {
print if /Kill|Someone|Just/;
}
__DATA__
Kill you, kill me.
Someone kill
yes do it
Just make.
Marry killed by money.
輸出:
Kill you, kill me.
Someone kill
Just make.
|
用例 8:$& $` $' 的涵義
$_ = "OK! Let's go! Very happy!";
/Very/;
print '$& ==> ' . $& . "\n";
print '$` ==> ' . $` . "\n";
print '$\' ==> ' . $' . "\n";
輸出:
$& ==> Very
$` ==> OK! Let's go!
$' ==> happy! |