Perl 「 正規表現 」: m// パターンのデリミタ (0x62)

セラ (perlackline)

2014年01月22日 18:23



目次 - Perl Index



Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x62 回。

Perl の「 正規表現 」( Regular expression ) m// 演算子を使ったパターンのデリミタについて。




m// 演算子



「 m// 」演算子は、Perl で正規表現を用いたパターンマッチングを行う際に、もっとも基本的な演算子です。

Perl 「 正規表現 」: 演算子とメタキャラクタ (0x58) 」でも触れた様に、Perl の正規表現は、「 m// 」、「 s/// 」、「 qr// 」、「 split 」の一部です。

「 m// 」演算子の「 m 」は、「 matching 」( あるいは match の )「 m 」と覚えます。

通常のパターンマッチングで使われる「 // 」は「 m 」が省略された形式です。

「 // 」演算子は、パターンマッチングの標準の「 デリミタ : 区切り文字 」 ( Delimiter ) として設定されているので、「 m 」の省略が可能となっています。

様々なデリミタ



Perl リストリテラル : クォート演算子「 qw 」(0x1e) 」で確認したのと同じ様に、「 m// 」演算子でもデリミタを任意に変更することが可能です。

例えば、次の様なデリミタが使えます。


m!pattern!; # デリミタに !
m?pattern?; # デリミタに ?
m#pattern#; # デリミタに #
m\pattern\; # デリミタに \
m>pattern>; # デリミタに >
m}pattern}; # デリミタに }

m; # デリミタに
m{pattern}; # デリミタに {}


これがすべてではありませんが、「 m 」を前置した場合に「 pattern 」内に同じ記号が存在しなければ、任意の記号が利用出来ると覚える良いと思います。

* 「 < > 」を除くカッコ ( [ ], { }, ( ) ) は、対で使う限り pettern 内でも利用可能です。e.g.「 m[pe[tt]ern] 等」

ただし、「 qw 」演算子と同様に、開始のデリミタが「 開きカッコ 」だった場合は、終了のデリミタは同じ種類の「 閉じカッコ 」でなければいけません。

デリミタの変更は Unix 系のシステムでとても重宝します。

Unix 系のシステムでは、ファイルの位置を表すシステムパスの区切りが「 / 」で表されているため、パターンマッチングの標準デリミタ「 / 」と区別が付かなくなるからです。

Web サイトの URL も同様に、ファイルの階層が「 / 」で区切られているので、デリミタの変更が有用です。

お馴染みの「 \ 」エスケープは利用可能ですが、素直にデリミタを変更した方がスマートです。


# 標準のデリミタ
/\/usr\local\/bin\/perl/;
/http:\/\/example.jp\/index.html/;

# 任意のデリミタ
m{/usr/local/bin/perl};
m#http://example.jp/index.html#;


0x62 -> 0x63 へ



Perl の正規表現のパターンマッチングでは、いくつかの修飾子が存在します。パターンマッチングの修飾子は、マッチングの挙動を任意に操作出来るオプションです。

これについては、次回確認する予定です。

参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。

目次 - Perl Index




















関連記事