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!