capturing
parentheses will not be penalized. So avoid C<$&>, C<$'>, and C<$`>
if you can, but if you can't (and some algorithms really appreciate
them), once you've used them once, use them at will, because you've
already paid the price. As of 5.005, C<$&> is not so costly as the
other two.
X<$&> X<$`> X<$'>
=end original
B<警告>: Perl は、一旦プログラム中のどこかで C<$&>, C<$`>, C<$'> の
いずれかを必要としていることを見つけると、全てのパターンマッチングで
それらを提供しなければなりません。
これはあなたのプログラムを大幅に遅くさせるでしょう。
Perl は $1, $2, 等の生成にも同じメカニズムを使っているので、
キャプチャのかっこに含まれるそれぞれのパターンにも
同じ料金を払っています。
(グループ化の振る舞いを維持しつつこのコストを削減するには
拡張正規表現 C<(?: ... )> を代わりに使います。
(訳注:Perl拡張というだけで C 修飾子は不要。))
ですが C<$&>, C<$`> または C<$'> を一度も使わなければ、
キャプチャのかっこをI<もたない>パターンではこの不利益はなくなります。
この為、可能であれば C<$&>, C<$'>, 及び C<$`> を削除しましょう:
しかしそれができなかった(そしてそれらを
本当に理解しているアルゴリズムがあるのであれば)、一旦
それらを使った時点でそれ以降は自由にそれらを使うことができます;
なぜならあなたは(一度使った時点で)既に代価を払っているので。
5.005 であれば C<$&> は他の2つほど高価ではありません。
X<$&> X<$`> X<$'>
=begin original
As a workaround for this problem, Perl 5.10.0 introduces C<${^PREMATCH}>,
C<${^MATCH}> and C<${^POSTMATCH}>, which are equivalent to C<$`>, C<$&>
and C<$'>, B that they are only guaranteed to be defined after a
successful match that was executed with the C (preserve) modifier.
The use of these variables incurs no global performance penalty, unlike
their punctuation char equivalents, however at the trade-off that you
have to tell perl when you want to use them.
X X
=end original
この問題に対する解決策として、Perl 5.10.0 からは C<$`>, C<$&>, C<$'> と
等価だけれども C
(preseve) 修飾子を伴って実行されたマッチングが
成功した後でのみ定義されることが保証される C<${^PREMATCH}>、
C<${^MATCH}> 及び C<${^POSTMATCH}> を導入しました。
これらの変数の使用は利用したいときに perl に伝える必要がある代わりに、
等価な記号変数とは違い全体的なパフォーマンスの低下を引き起こしません。
=begin original
Backslashed metacharacters in Perl are alphanumeric, such as C<\b>,
C<\w>, C<\n>. Unlike some other regular expression languages, there
are no backslashed symbols that aren't alphanumeric. So anything
that looks like \\, \(, \), \<, \>, \{, or \} is always
interpreted as a literal character, not a metacharacter. This was
once used in a common idiom to disable or quote the special meanings
of regular expression metacharacters in a string that you want to
use for a pattern. Simply quote all non-"word" characters:
=end original
Perl においてバックスラッシュで表現されるメタ文字は C<\b>, C<\w>,
C<\n> のように英数字です。
他の正規表現言語とは異なり、英数字でないシンボルのバックスラッシュは
ありません。
なので \\, \(, \), \<, \>, \{, \} といったものは全てメタ文字ではなく
リテラル文字です。
これはパターンで使いたい文字列の中で正規表現のメタ文字としての特殊な意味を
無効化またはクォートするための一般的な指標として使われてきました。
「単語」でない全ての文字は単にクォートします:
$pattern =~ s/(\W)/\\$1/g;
=begin original
(If C