Perlは本来、テキストデータを処理するものです、その中でも最も強力なものがパターンマッチ処理です。パターンマッチ処理とは、文字列の中に特定のパターンと一致する部分があるかどうかを調べることです。パターンと一致した場合に条件を分岐させたり、文字列を置き換えたりすることができるようになります。
正規表現のマッチング
以下の例では、「文字列」の中に「正規表現」で指定した内容と一致する部分があったときに、判断を分岐させるときの例を上げています。 (モード修飾子は英大文字と小文字の区別を無視したりするとき等、パターンマッチの方法を一部変更するときに使います。)
【正規表現がマッチする場合】 if (変数 =~ /正規表現パターン/モード修飾子) { マッチしたときに実行する命令 } 【正規表現がマッチしない場合】 if (変数 =! /正規表現パターン/モード修飾子) { マッチしないときに実行する命令 }
正規表現パターンが複数あった場合は、先頭に近いものが選ばれます。マッチすると、式の値は「真」になり、マッチしないと「偽」になるので、if文の条件式にもなります。なお、「 =~ 」の「 ~ 」(チルダ)は、「 ^ 」キー(ひらがなの「へ」のキー)でシフト(Shift)キーを押したまま「 ^ 」キーを押して入力します。
上記のように区切り文字は通常、"/"を使用します。このため、「正規表現パターン」の中に"/"がある場合は、区切り文字との区別がつかなくなるため、"\/"と変更します。ただし、区切り文字を"/"以外にすれば、このような変更を行う必要もなくなります。"/"以外の区切り文字は、「英数字と"_"(アンダーバー)」以外の文字ですが、具体的には、"!"・"#"・"$"・"%"・"&"・ "*"などを使用することができます。ただし、"/"のときと同じように、区切り文字に"#"を使い、「正規表現パターン」に"#"を使用する場合は、「正規表現パターン」の中の"#"は"\#"と変更します。
また、かっこなどを使用することができますが、"("と")"、"<"と">"、"{"と"}"、"["と"]"は必ず対応させて使用します。
したがって、以下のようにすることができます。
if (変数 =~ !正規表現パターン!モード修飾子) { マッチしたときに実行する命令 } if (変数 =~ #正規表現パターン#モード修飾子) { マッチしたときに実行する命令 } if (変数 =~ $正規表現パターン$モード修飾子) { マッチしたときに実行する命令 } if (変数 =~ %正規表現パターン%モード修飾子) { マッチしたときに実行する命令 } if (変数 =~ &正規表現パターン&モード修飾子) { マッチしたときに実行する命令 } if (変数 =~ *正規表現パターン*モード修飾子) { マッチしたときに実行する命令 } if (変数 =~ (正規表現パターン)モード修飾子) { マッチしたときに実行する命令 } if (変数 =~ <正規表現パターン>モード修飾子) { マッチしたときに実行する命令 } if (変数 =~ {正規表現パターン}モード修飾子) { マッチしたときに実行する命令 } if (変数 =~ [正規表現パターン]モード修飾子) { マッチしたときに実行する命令 }
パターンマッチでエラーになってしまう場合には、全角文字が含まれていたり、スクリプトが"shift_jis"である場合がよくあります。その場合は、スクリプトをutf-8などに変更し、スクリプト上で"use UTF8;"と指定することで回避できる場合があります(スクリプトと入力ファイルの文字コードは一致させておいたほうがエラーになりにくくなります)。
正規表現による文字列の置換
また、文字列を検索したり、検索した文字列を別の文字列に置き換えたりすることもできます。
以下の例では、「変数」の中に「正規表現」で指定した内容と一致する部分があれば、「置き換える文字列」に変更するときに使います。 (モード修飾子は英大文字と小文字の区別を無視したりするとき等、パターンマッチの方法を一部変更するときに使います。)
変数 =~ s/正規表現/置き換える文字列/モード修飾子;
文字列の置換でも、区切り文字は通常、"/"を使用します。このため、「正規表現パターン」の中に"/"がある場合は、区切り文字との区別がつかなくなるため、"\/"と変更します。ただし、区切り文字を"/"以外にすれば、このような変更を行う必要もなくなります。"/"以外の区切り文字は、「英数字と"_"(アンダーバー)」以外の文字ですが、具体的には、"!"、"#"、"$"、"%"、"&"、"*"などを使用することができます。
また、かっこなどを使用することができますが、"("と")"、"<"と">"、"{"と"}"、"["と"]"は必ず対応させて使用します。
正規表現による文字の置換
また、文字列ではなく、「文字」を置き換える場合は以下のようになります。
変数 =~ tr/文字/対応する文字/モード修飾子;
モード修飾子には、以下のようなものがあり、それぞれ以下のような意味があります(他にもいろいろなモード修飾子があります)。
g マッチするものすべてを置き換える。 (モード修飾子gを付けないと、先頭に近いものが1つだけ置き換えられる) i 大文字と小文字の違いを無視する。 x 正規表現の中コメントを無視する。 o パターンの再コンパイルを一度だけ行う。
このうち、モード修飾子"o"は、以下のような場合に使います。
正規表現パターンを変数で指定した場合、Perlではパターンマッチするごとに毎回、前処理(コンパイル)を行いますので、処理効率が低下しますが、このオプションを指定すると、Perl実行時に1回だけ前処理(コンパイル)を行うため、処理効率が上がります。このような場合に、モード修飾子"o"を使います。
正規表現に全角文字を含む場合のマッチングや置換
正規表現に全角文字を含む場合のマッチングや置換を行う場合は、スクリプトをshift_jisにしていると、エラーになることがありますので、スクリプトをutf-8などに変更し、スクリプト上で、"use UTF8;"と指定し、必要に応じて、入力ファイルも"UTF-8"に変更しておきます。具体的には[3-5-3.文字コードの変換(open プラグマ 使用)]を参照してください。また、同じフォルダ内のファイルを一括して変更する場合については、[[3-3-3.フォルダ内のファイルについて一括変更をする]を参照してください。