Perl 「 正規表現 」: s/// デリミタを変更する (0x75)

セラ (perlackline)

2014年02月19日 17:53



目次 - Perl Index



Theme



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

Perl 「 正規表現 」( Regular expression )「 s/// 」演算子のデリミタを変更する。




置換演算子のデリミタ



Perl 「 正規表現 」: m// パターンのデリミタ (0x62) 」では、マッチ演算子「 m// 」のデリミタの変更を確認しました。

置換演算子「 s/// 」でも同様にデリミタを変更することが出来ます。

デリミタを変更する



置換演算子「 s/// 」のデリミタ変更の用法は、マッチ演算子「 m// 」とほとんど同じです。


s!oo!uu!g;
s?uu?xx?g;
s#xx#aa#g;
s\aa\bb\g;
s>bb>ii>g;
s}ii}oo}g;


通常「 # 」は、Perl でコメントを表します。また、「 \ 」はエスケープに使われます。しかし、これらをデリミタが期待される位置に使った場合、Perl はそれをデリミタとして認識します。

つまり、次の様にコメントを付けても問題はありません。


s#xx#aa#g; # Comment


デリミタ変更時の注意



マッチ演算子「 m// 」でデリミタを変更する場合と同様に、開始のデリミタに開きカッコを指定した場合は、終了のデリミタには閉じカッコを指定しなければいけませんが、 置換演算子「 s/// 」は、「 m// 」よりもデリミタがひとつ多いので、次の様に指定する必要があります。


s[PATTERN][REPLACE];
s{PATTERN}{REPLACE};
s;
s(PATTERN)(REPLACE);


「 PATTERN 」と「 REPLACE 」を囲むカッコは別の種類でも構いません。


s[PATTERN](REPLACE);


また、「 ( ) 」をデリミタにした場合でも、メタキャラクタとしての「 ( ) 」の機能は発揮される様です。


s((PATTERN))($1 REPLACE);


ただし、シングルクォート「 ' 」をデリミタに使用した場合は変数展開が出来ません。

これは「 Perl 「 リストリテラル 」: クォート演算子「 qw 」(0x1e) 」で確認したのと同じことです。

0x75 -> 0x76 へ



当初の僕は、省略可能な「 $_ 」や「 @_ 」をあえて書きおく様にしていました。それが今では自然と省略する様になっています。

あまりに省けることが混乱の元になっていると思っていたにも関わらず、「 文脈から読み取れるのだから不要だろう 」と今では思っている訳です。

これらは、「 慣れ 」の一言で片づけられる事柄でありつつも、なぜそれを省略出来るのか、なぜそれを置き換えることが出来るのか、という裏付けは、いつでも言語化出来る体制でいたいと思っています。

様々に変更出来るデリミタに対しても、やがて「 慣れ 」る時期が訪れるはずですが、これも同様にそうした裏付けを少しでも知っておきたいと思っています。

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

目次 - Perl Index




















関連記事