KAIHATSUGIKEN GROUP
*************************************************************************************
13 パターンマッチ
***********************
文字列が正規表現にマッチするかどうかを調べることをパターンマッチと言います。
変数$str に入っている文字列と正規表現のパターンマッチは次のように書きます。
$str=~/[a-z]+/
正規表現を \ で囲んで書き、調べたい変数と =~ でつなげます。
=~ の~(チルダ) を忘れたり、=と~の間にスペースを入れてはいけません。
変数 =~ /正規表現/ を実行すると変数の中の文字列と正規表現がマッチするかどうかの
真偽値を返します。
普通はifをつかいます。
if($str=~/[a-z]+/){
print"matc\n";
}else{
print"notmatch\n";
}
=~の代わりに!~を使うとマッチしないかどうかを調べることが出来ます。
変数=~の部分を省略して /正規表現/ だけを書くと$_ を指定したことになります。
ダイヤモンド演算子 <> を書くと入力した行が自動的に $_ にはいるのでそれと組み合わせると
便利です。
while(<>){
if(/[a-z]+/){
print"match\n";
}else{
print"notmatch\n";
}
}
の様になります。
実行すると
abc (ユーザーの入力)
match
012 (ユーザーの入力)
nomatch
012a (ユーザーの入力)
match
となります。
[a-z]+ は 1文字以上のアルファベットとマッチします。
012a は 対象の文字列の中にどこか一部分でもマッチする部分があればマッチしたことになります。
こんな使い方もあります。
/[a-z]+/ 文字列の中に[a-z]+ にマッチする部分があるか
/^[a-z]+/ 文字列が[a-z]+ で始まっているか
/[a-z]+$/ 文字列が[a-z]+ で終わっているか
/^[a-z]+$/ 文字列全体が [a-z]+にマッチしているか
です。
ところでこんなのはどうでしょう?
$` マッチした部分より前
$& マッチした部分
$' マッチした部分より後ろ
これは
while(<>){
chomp;
if(/[a-z]+/){
print"<$`><$&<>$'>\n";
}else{
print"not match\n";
}
}
と言う例で考えてみましょう?
最初のchomp; は $_の中の最後の改行を取り除く組み込み関数です。
$_ の最後に改行がついていると、$' にも最後に改行が入ってしまい、プリント
しにくくなるので最初に取り除くことを表します。
「最初に chomp した?」
とかいいます。
実行すると、
012abc345 ユーザーの入力
<012><abc><345>
abc ユーザーの入力
<><abc><>
abc012def ユーザーの入力
<><abc><012def>
となります。
正規表現は [abc]+ なのでabc の部分にマッチします。
マッチしたabcは真ん中のabcの部分にマッチします。
マッチしたabcは$&に代入されます。
マッチした部分の前の012は&`に代入されます。
マッチした部分より後ろの345は$'に代入されます。
abc012def は両方ともアルファベットなのに・・・
これは 最初の方がマッチすることが解ります。
ちなみに英語で書くこともできます。
いやいや パールは親切だね・・・
use English;
while(<>){
chomp;
if(/[a-z]+/){
print"<$prematch><$match><$postmatch>\n";
}else{
print"not match\n";
}
}
****************************************************